কোনও মানচিত্রে কীতে কী রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


760

আমি জানি আমি কোনও মানচিত্রে পুনরাবৃত্তি করতে পারি m,

for k, v := range m { ... }

এবং কীটির সন্ধান করুন তবে কী কোনও মানচিত্রে কীটির অস্তিত্ব পরীক্ষা করার আরও কার্যকর উপায় আছে?

ভাষা অনুমানে আমি উত্তরটি খুঁজে পাইনি ।


2

উত্তর:


1469

এক লাইনের উত্তর:

if val, ok := dict["foo"]; ok {
    //do something here
}

ব্যাখ্যা:

ifগো-এর বিবৃতিতে শর্ত এবং একটি সূচনা বিবৃতি উভয়ই অন্তর্ভুক্ত থাকতে পারে। উপরের উদাহরণ দুটি ব্যবহার করে:

  • দুটি ভেরিয়েবল সূচনা করে - valমানচিত্র থেকে "foo" এর মান বা একটি "শূন্য মান" (এই ক্ষেত্রে খালি স্ট্রিং) okপাবে এবং একটি বুল পাবেন trueযা মানচিত্রে "foo" আসলে উপস্থিত থাকলে সেট করা হবে

  • "foo" মানচিত্রে থাকলে okযা মূল্যায়ন করবেtrue

যদি "foo" মানচিত্রে উপস্থিত থাকে তবে ifবিবৃতিটির মূল অংশ কার্যকর করা valহবে এবং সেই সুযোগে স্থানীয় হবে to


2
এটি কীভাবে কাজ করে তা আরও ভালভাবে ব্যাখ্যা করা যেতে পারে (পিটারসো-র অন্যান্য মন্তব্যের মতো)
চমোয়েল বউদজানাহ

6
@ কিরিল var val string = ""একই থাকবে, val, ok :=একই নামের সাথে একটি নতুন স্থানীয় ভেরিয়েবল তৈরি করবে যা কেবলমাত্র সেই ব্লকটিতে দৃশ্যমান।
ওয়ানঅফনে

1
দুর্দান্ত উত্তর, আপনি কি বলবেন যে এর জটিলতা হ'ল হে (1) ??
মহেনি

1
@ মেনি, আমি জানি আমি এখানে কিছুটা দেরি করেছি, তবে এই প্রশ্নটি অনুসন্ধানের জটিলতা নিয়ে আলোচনা করে। বেশিরভাগ সময় অ্যামরোটাইজড জটিলতা হ'ল ও (1) তবে এই প্রশ্নের উত্তরগুলি পড়া ভাল।
3ocene

70
পাইথনের তুলনায় এমন বিভ্রান্তিকর বাক্য গঠন if key in dict
প্রঞ্জল মিত্তাল

128

গো প্রোগ্রামিং ল্যাঙ্গুয়েজ স্পেসিফিকেশন ছাড়াও আপনার কার্যকর Go টি পড়া উচিত । মানচিত্রের বিভাগে , তারা অন্যান্য জিনিসগুলির মধ্যে বলে:

মানচিত্রে উপস্থিত না এমন কী দিয়ে মানচিত্রের মানটি আনার চেষ্টা মানচিত্রে প্রবেশের ধরণের জন্য শূন্য মানটি ফিরিয়ে দেবে। উদাহরণস্বরূপ, মানচিত্রে যদি পূর্ণসংখ্যা থাকে, অস্তিত্বের কীটি সন্ধান করে 0 ফিরে আসবে A মানচিত্রের বুল সহ একটি সেট মানচিত্র হিসাবে প্রয়োগ করা যেতে পারে। মানটিতে সেটটিতে মান রাখার জন্য মানচিত্রের এন্ট্রিটিকে সত্যে সেট করুন এবং তারপরে সাধারণ সূচিকর্ম দ্বারা এটি পরীক্ষা করুন।

attended := map[string]bool{
    "Ann": true,
    "Joe": true,
    ...
}

if attended[person] { // will be false if person is not in the map
    fmt.Println(person, "was at the meeting")
}

কখনও কখনও আপনাকে একটি শূন্য মান থেকে অনুপস্থিত এন্ট্রি আলাদা করতে হবে। "ইউটিসি" এর জন্য কোনও এন্ট্রি আছে নাকি এটি 0 হওয়ায় মানচিত্রটিতে একেবারেই নেই? আপনি একাধিক অ্যাসাইনমেন্টের একটি ফর্মের সাথে বৈষম্য করতে পারেন।

var seconds int
var ok bool
seconds, ok = timeZone[tz]

সুস্পষ্ট কারণে এটিকে "কমা ওকে" আইডিয়াম বলা হয়। এই উদাহরণে, tz উপস্থিত থাকলে, সেকেন্ড যথাযথভাবে সেট করা হবে এবং ঠিক আছে সত্য হবে; যদি তা না হয়, সেকেন্ড শূন্যতে সেট করা হবে এবং ঠিক আছে মিথ্যা। এখানে একটি ফাংশন যা এটি একটি সুন্দর ত্রুটির প্রতিবেদনের সাথে একত্রিত করে:

func offset(tz string) int {
    if seconds, ok := timeZone[tz]; ok {
        return seconds
    }
    log.Println("unknown time zone:", tz)
    return 0
}

প্রকৃত মান সম্পর্কে চিন্তা না করে মানচিত্রে উপস্থিতির জন্য পরীক্ষা করতে, আপনি মানটির জন্য সাধারণ ভেরিয়েবলের জায়গায় ফাঁকা শনাক্তকারী (_) ব্যবহার করতে পারেন।

_, present := timeZone[tz]

57

গো-বাদামের ইমেল তালিকায় অনুসন্ধান করা হয়েছে এবং 11/15/ 2009-এ পিটার ফ্রয়েলিচ পোস্ট করেছেন এমন একটি সমাধান খুঁজে পেয়েছেন।

package main

import "fmt"

func main() {
        dict := map[string]int {"foo" : 1, "bar" : 2}
        value, ok := dict["baz"]
        if ok {
                fmt.Println("value: ", value)
        } else {
                fmt.Println("key not found")
        }
}

বা আরও সংক্ষিপ্তভাবে,

if value, ok := dict["baz"]; ok {
    fmt.Println("value: ", value)
} else {
    fmt.Println("key not found")
}

দ্রষ্টব্য, ifবিবৃতিটির এই ফর্মটি ব্যবহার করে valueএবং okভেরিয়েবলগুলি কেবলমাত্র ifশর্তের মধ্যেই দৃশ্যমান ।


20
আপনি যদি কীটির সত্যই আগ্রহী হন তবে কীটি রয়েছে কিনা এবং মানটির বিষয়ে যত্নশীল না হলে আপনি ব্যবহার করতে পারেন _, ok := dict["baz"]; ok_অংশ একটি অস্থায়ী পরিবর্তনশীল তৈরি করার দূরে মান ছোঁড়ার পরিবর্তে।
ম্যাথু ক্রামলে

26

সংক্ষিপ্ত উত্তর

_, exists := timeZone[tz]    // Just checks for key existence
val, exists := timeZone[tz]  // Checks for key existence and retrieves the value

উদাহরণ

গো খেলার মাঠের একটি উদাহরণ এখানে ।

দীর্ঘ উত্তর

প্রতি মানচিত্র বিভাগে কার্যকরী যান :

মানচিত্রে উপস্থিত না এমন কী দিয়ে মানচিত্রের মানটি আনার চেষ্টা মানচিত্রে প্রবেশের ধরণের জন্য শূন্য মানটি ফিরিয়ে দেবে। উদাহরণস্বরূপ, মানচিত্রে যদি পূর্ণসংখ্যা থাকে, অস্তিত্বের কীটি সন্ধান করে 0 ফিরে আসবে।

কখনও কখনও আপনাকে একটি শূন্য মান থেকে অনুপস্থিত এন্ট্রি আলাদা করতে হবে। "ইউটিসি" এর জন্য কোনও এন্ট্রি আছে নাকি খালি স্ট্রিংটি মানচিত্রে একেবারেই না থাকার কারণে? আপনি একাধিক অ্যাসাইনমেন্টের একটি ফর্মের সাথে বৈষম্য করতে পারেন।

var seconds int
var ok bool
seconds, ok = timeZone[tz]

সুস্পষ্ট কারণে এটিকে "কমা ওকে" আইডিয়াম বলা হয়। এই উদাহরণে, tz উপস্থিত থাকলে, সেকেন্ড যথাযথভাবে সেট করা হবে এবং ঠিক আছে সত্য হবে; যদি তা না হয়, সেকেন্ড শূন্যতে সেট করা হবে এবং ঠিক আছে মিথ্যা। এখানে একটি ফাংশন যা এটি একটি সুন্দর ত্রুটির প্রতিবেদনের সাথে একত্রিত করে:

func offset(tz string) int {
    if seconds, ok := timeZone[tz]; ok {
        return seconds
    }
    log.Println("unknown time zone:", tz)
    return 0
}

প্রকৃত মান সম্পর্কে চিন্তা না করে মানচিত্রে উপস্থিতির জন্য পরীক্ষা করতে, আপনি মানটির জন্য সাধারণ ভেরিয়েবলের জায়গায় ফাঁকা শনাক্তকারী (_) ব্যবহার করতে পারেন।

_, present := timeZone[tz]

13

অন্যান্য উত্তর দ্বারা হিসাবে উল্লিখিত, সাধারণ সমাধান একটি ব্যবহার করা সূচক অভিব্যক্তি একটি ইন নিয়োগ বিশেষ ফর্মের:

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]

এটি সুন্দর এবং পরিষ্কার। যদিও এর কিছু বিধিনিষেধ রয়েছে: এটি অবশ্যই বিশেষ ফর্মের একটি অ্যাসাইনমেন্ট হতে হবে। ডান হাতের এক্সপ্রেশনটি কেবল মানচিত্র সূচক এক্সপ্রেশন হওয়া আবশ্যক এবং বাম-হাতের এক্সপ্রেশন তালিকায় অবশ্যই 2 টি অপারেশন থাকতে হবে, প্রথমে মানের ধরণটি নির্ধারিত হয় এবং দ্বিতীয়টি যেখানে কোনও boolমান নির্ধারিত হয়। এই বিশেষ ফর্মের ফলাফলের প্রথম মানটি কীটির সাথে সম্পর্কিত মান হবে এবং দ্বিতীয় মানটি প্রদত্ত কীটির সাথে মানচিত্রে আসলে কোনও প্রবেশিকা আছে কিনা (যদি মানচিত্রে কীটি বিদ্যমান থাকে) তা জানাবে। বাম-হাতের এক্সপ্রেশন তালিকায় কোনও ফলাফলের প্রয়োজন না হলে খালি শনাক্তকারীও থাকতে পারে ।

এটি জেনে রাখা গুরুত্বপূর্ণ যে যদি সূচিযুক্ত মানচিত্রের মানটি nilকী থাকে বা না থাকে তবে সূচক এক্সপ্রেশন মানচিত্রের মান ধরণের শূন্য মানের মূল্যায়ন করে । উদাহরণস্বরূপ:

m := map[int]string{}
s := m[1] // s will be the empty string ""
var m2 map[int]float64 // m2 is nil!
f := m2[2] // f will be 0.0

fmt.Printf("%q %f", s, f) // Prints: "" 0.000000

এটি গো খেলার মাঠে চেষ্টা করুন ।

সুতরাং আমরা যদি জানি যে আমরা আমাদের মানচিত্রে শূন্য মানটি ব্যবহার করি না, আমরা এর সুবিধা নিতে পারি।

উদাহরণস্বরূপ যদি মানের ধরণটি হয় stringএবং আমরা জানি আমরা মানচিত্রে প্রবেশের স্থানটি কখনই সঞ্চয় করি না যেখানে মানটি শূন্য স্ট্রিং ( stringপ্রকারের শূন্য মান ) হয়, মানটি কী-অ-বিশেষের সাথে তুলনা করে আমরা পরীক্ষা করতে পারি শূন্য মান সূচক এক্সপ্রেশন ফর্ম (এর ফলাফল):

m := map[int]string{
    0: "zero",
    1: "one",
}

fmt.Printf("Key 0 exists: %t\nKey 1 exists: %t\nKey 2 exists: %t",
    m[0] != "", m[1] != "", m[2] != "")

আউটপুট ( গো খেলার মাঠে এটি চেষ্টা করুন ):

Key 0 exists: true
Key 1 exists: true
Key 2 exists: false

অনুশীলনে এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে আমরা মানচিত্রে শূন্য-মান মান সংরক্ষণ করি না, তাই এটি প্রায়শই ব্যবহার করা যায়। উদাহরণস্বরূপ ইন্টারফেস এবং ফাংশন ধরণেরগুলির একটি শূন্য মান থাকে nilযা আমরা প্রায়শই মানচিত্রে সঞ্চয় করি না। সুতরাং মানচিত্রটিতে কোনও কী রয়েছে কিনা তা পরীক্ষা করে এটির সাথে তুলনা করে অর্জন করা যেতে পারে nil

এই "কৌশল" ব্যবহারের আরও একটি সুবিধাও রয়েছে: আপনি একটি কমপ্যাক্ট উপায়ে একাধিক কীগুলির অস্তিত্ব পরীক্ষা করতে পারেন (বিশেষ "কমা ওকে" ফর্মের সাহায্যে আপনি এটি করতে পারবেন না)। এই সম্পর্কে আরও: এক শর্তে একাধিক মানচিত্রে কী বিদ্যমান কিনা তা পরীক্ষা করুন

অ-বিদ্যমান কী সহ সূচীকরণের সময় মান ধরণের শূন্য মান পাওয়া আমাদের সেটbool হিসাবে মান সহ মানচিত্রে মানচিত্র ব্যবহার করার অনুমতি দেয় । উদাহরণ স্বরূপ:

set := map[string]bool{
    "one": true,
    "two": true,
}

fmt.Println("Contains 'one':", set["one"])

if set["two"] {
    fmt.Println("'two' is in the set")
}
if !set["three"] {
    fmt.Println("'three' is not in the set")
}

এটি ফলাফল ( গো খেলার মাঠে চেষ্টা করে দেখুন ):

Contains 'one': true
'two' is in the set
'three' is not in the set

সম্পর্কিত দেখুন: আমি কীভাবে এমন একটি অ্যারে তৈরি করতে পারি যাতে অনন্য স্ট্রিং থাকে?


1
কি Tমধ্যে var v, ok T = a[x]? নয় okbool, হতে হবে?
কোকিজু

2
@ কোকিজু এটি পরিবর্তনশীল ঘোষণার সাধারণ রূপ। প্রথমে আমরা মনে হতে পারে এটি শুধুমাত্র কাজ করবে (কম্পাইল) যদি মানচিত্র ধরনের হতে হবে map[bool]boolএবং Tহয় bool, কিন্তু এটি যদি মানচিত্র ধরনের কাজ করে map[interface{}]boolএবং Tহয় interface{}; তদতিরিক্ত, এটি boolঅন্তর্নিহিত প্রকারের মতো কাস্টম ধরণের সাথেও কাজ করে, গো প্লেগ্রাউন্ডে সমস্ত দেখুন । যেহেতু সেই ফর্মটি একাধিক প্রকারের পরিবর্তে বৈধ T, তাই সাধারণ Tব্যবহার করা হয়। প্রকার okযা কিছু একটি হতে পারে untypedbool নিয়োগ করা যেতে পারে।
আইজজা 12:57


4
    var d map[string]string
    value, ok := d["key"]
    if ok {
        fmt.Println("Key Present ", value)
    } else {
        fmt.Println(" Key Not Present ")
    }

3
    var empty struct{}
    var ok bool
    var m map[string]struct{}
    m = make(map[string]struct{})
    m["somestring"] = empty


    _, ok = m["somestring"]
    fmt.Println("somestring exists?", ok) 
    _, ok = m["not"]
    fmt.Println("not exists?", ok)

তারপরে, মানচিত্রগুলি চালান যান go কোথাও কিছু উপস্থিত রয়েছে? সত্য কি নেই? মিথ্যা



অবদানের জন্য ধন্যবাদ, তবে আমি মনে করি বর্তমান উত্তরগুলি প্রশ্নটি ভালভাবে কভার করে। আপনি এখানে যা বলছেন তা থেকে আপনার উত্তরটি গো প্রকারের প্রশ্নের সেট সেট প্রয়োগের সর্বোত্তম পদ্ধতির সাথে আরও উপযুক্ত ।
টমাসজ

_, ok = m["somestring"]হওয়া উচিত=_, ok := m["somestring"]
এলরোয় জেটসন

3

এটি "সূচক এক্সপ্রেশন" এর অধীনে উল্লেখ করা হয়েছে ।

কোনও মানচিত্রে একটি সূচক এক্সপ্রেশন, বিশেষ ফর্মের অ্যাসাইনমেন্ট বা প্রারম্ভিককরণে ব্যবহৃত টাইপের মানচিত্রের [কে] ভি

v, ok = a[x] 
v, ok := a[x] 
var v, ok = a[x]

অতিরিক্ত টাইপযুক্ত বুলিয়ান মান দেয়। কীটির মান মানচিত্রে উপস্থিত থাকলে ঠিক আছে এবং অন্যথায় মিথ্যা false


1

এই উদ্দেশ্যে একটি দুটি মান অ্যাসাইনমেন্ট ব্যবহার করা যেতে পারে। নীচে আমার নমুনা প্রোগ্রাম চেক করুন

package main

import (
    "fmt"
)

func main() {
    //creating a map with 3 key-value pairs
    sampleMap := map[string]int{"key1": 100, "key2": 500, "key3": 999}
    //A two value assignment can be used to check existence of a key.
    value, isKeyPresent := sampleMap["key2"]
    //isKeyPresent will be true if key present in sampleMap
    if isKeyPresent {
        //key exist
        fmt.Println("key present, value =  ", value)
    } else {
        //key does not exist
        fmt.Println("key does not exist")
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.