আমি জানি আমি কোনও মানচিত্রে পুনরাবৃত্তি করতে পারি m
,
for k, v := range m { ... }
এবং কীটির সন্ধান করুন তবে কী কোনও মানচিত্রে কীটির অস্তিত্ব পরীক্ষা করার আরও কার্যকর উপায় আছে?
ভাষা অনুমানে আমি উত্তরটি খুঁজে পাইনি ।
আমি জানি আমি কোনও মানচিত্রে পুনরাবৃত্তি করতে পারি m
,
for k, v := range m { ... }
এবং কীটির সন্ধান করুন তবে কী কোনও মানচিত্রে কীটির অস্তিত্ব পরীক্ষা করার আরও কার্যকর উপায় আছে?
ভাষা অনুমানে আমি উত্তরটি খুঁজে পাইনি ।
উত্তর:
এক লাইনের উত্তর:
if val, ok := dict["foo"]; ok {
//do something here
}
if
গো-এর বিবৃতিতে শর্ত এবং একটি সূচনা বিবৃতি উভয়ই অন্তর্ভুক্ত থাকতে পারে। উপরের উদাহরণ দুটি ব্যবহার করে:
দুটি ভেরিয়েবল সূচনা করে - val
মানচিত্র থেকে "foo" এর মান বা একটি "শূন্য মান" (এই ক্ষেত্রে খালি স্ট্রিং) ok
পাবে এবং একটি বুল পাবেন true
যা মানচিত্রে "foo" আসলে উপস্থিত থাকলে সেট করা হবে
"foo" মানচিত্রে থাকলে ok
যা মূল্যায়ন করবেtrue
যদি "foo" মানচিত্রে উপস্থিত থাকে তবে if
বিবৃতিটির মূল অংশ কার্যকর করা val
হবে এবং সেই সুযোগে স্থানীয় হবে to
var val string = ""
একই থাকবে, val, ok :=
একই নামের সাথে একটি নতুন স্থানীয় ভেরিয়েবল তৈরি করবে যা কেবলমাত্র সেই ব্লকটিতে দৃশ্যমান।
if key in dict
।
গো প্রোগ্রামিং ল্যাঙ্গুয়েজ স্পেসিফিকেশন ছাড়াও আপনার কার্যকর 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]
গো-বাদামের ইমেল তালিকায় অনুসন্ধান করা হয়েছে এবং 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
শর্তের মধ্যেই দৃশ্যমান ।
_, ok := dict["baz"]; ok
। _
অংশ একটি অস্থায়ী পরিবর্তনশীল তৈরি করার দূরে মান ছোঁড়ার পরিবর্তে।
_, 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]
অন্যান্য উত্তর দ্বারা হিসাবে উল্লিখিত, সাধারণ সমাধান একটি ব্যবহার করা সূচক অভিব্যক্তি একটি ইন নিয়োগ বিশেষ ফর্মের:
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
সম্পর্কিত দেখুন: আমি কীভাবে এমন একটি অ্যারে তৈরি করতে পারি যাতে অনন্য স্ট্রিং থাকে?
T
মধ্যে var v, ok T = a[x]
? নয় ok
bool, হতে হবে?
map[bool]bool
এবং T
হয় bool
, কিন্তু এটি যদি মানচিত্র ধরনের কাজ করে map[interface{}]bool
এবং T
হয় interface{}
; তদতিরিক্ত, এটি bool
অন্তর্নিহিত প্রকারের মতো কাস্টম ধরণের সাথেও কাজ করে, গো প্লেগ্রাউন্ডে সমস্ত দেখুন । যেহেতু সেই ফর্মটি একাধিক প্রকারের পরিবর্তে বৈধ T
, তাই সাধারণ T
ব্যবহার করা হয়। প্রকার ok
যা কিছু একটি হতে পারে untypedbool
নিয়োগ করা যেতে পারে।
এখানে ভাল উপায়
if _, ok := dict["foo"]; ok {
//do something here
}
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"]
এটি "সূচক এক্সপ্রেশন" এর অধীনে উল্লেখ করা হয়েছে ।
কোনও মানচিত্রে একটি সূচক এক্সপ্রেশন, বিশেষ ফর্মের অ্যাসাইনমেন্ট বা প্রারম্ভিককরণে ব্যবহৃত টাইপের মানচিত্রের [কে] ভি
v, ok = a[x] v, ok := a[x] var v, ok = a[x]
অতিরিক্ত টাইপযুক্ত বুলিয়ান মান দেয়। কীটির মান মানচিত্রে উপস্থিত থাকলে ঠিক আছে এবং অন্যথায় মিথ্যা false
এই উদ্দেশ্যে একটি দুটি মান অ্যাসাইনমেন্ট ব্যবহার করা যেতে পারে। নীচে আমার নমুনা প্রোগ্রাম চেক করুন
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")
}
}