মডিউল পাঠ (2/5)
টাইপ দাবী
একটি টাইপ দাবী একটি ইন্টারফেস মান থেকে কংক্রিট টাইপ বের করে।
যখন আপনার কাছে একটি interface{} (বা একটি "উচ্চ" ইন্টারফেস) থাকে তখন আপনার এটি প্রয়োজন
হাত এবং ক্ষেত্রগুলি অ্যাক্সেস করার জন্য এটির নির্দিষ্ট ধরন হিসাবে এটি ব্যবহার করতে হবে বা
পদ্ধতিগুলি ইন্টারফেসে উপস্থিত নয়।
সিনট্যাক্স
var i interface{} = "ciao"
s := i.(string) // "panic" form: panics if it's not a string
s, ok := i.(string) // "comma ok" form: ok = false if it's not a stringদুটি রূপ, দুটি শব্দার্থবিদ্যা:
| ফর্ম | সাফল্য | ব্যর্থতা |
|---|---|---|
v := i.(T) | v = T এর মান | রানটাইমে আতঙ্ক |
v, ok := i.(T) | v=..., ok=true | v = T এর শূন্য মান, ok=false |
"কমা ঠিক আছে" ফর্ম: সবচেয়ে নিরাপদ
var i interface{} = 42
if s, ok := i.(string); ok {
fmt.Println("è stringa:", s)
} else {
fmt.Println("non è stringa, ignoro")
}ok আপনাকে আতঙ্ক ছাড়াই "ভুল টাইপ" কেস পরিচালনা করতে দেয়৷ এটা
বেশিরভাগ ক্ষেত্রেই ইডিওম্যাটিক প্যাটার্ন।
একটি ইন্টারফেসে দাবী
দাবী শুধুমাত্র কংক্রিট ধরনের কাজ করে না, কিন্তু অন্যান্য ইন্টারফেস:
type Closer interface { Close() error }
func tryClose(x interface{}) {
if c, ok := x.(Closer); ok {
c.Close()
}
}স্ট্যান্ডার্ড লাইব্রেরিতে একটি খুব সাধারণ প্যাটার্ন: "যদি আমার ইনপুটও হয়
একটি io.Closer, শেষে কল বন্ধ করুন"।
পয়েন্টার বনাম মান উপর দাবী
দাবীটি অবশ্যই গতিশীল প্রকারের সাথে মিলবে:
type Cat struct{}
func (c *Cat) Meow() {}
var a interface{} = &Cat{}
c1, ok := a.(*Cat) // ok = true
c2, ok := a.(Cat) // ok = false: it holds *Cat, not Catটাইপ সিস্টেমের জন্য *Cat এবং Cat স্বতন্ত্র প্রকার।
কখন অ্যাসারশন বনাম টাইপ সুইচ ব্যবহার করবেন
- শুধুমাত্র ১টি সম্ভাব্য প্রকার, "ফিচার-ডিটেক্ট" চেক (যেমন একটি ঐচ্ছিক ইন্টারফেসে কাস্ট করুন):
comma okএর সাথে টাইপ অ্যাসারশন। - 2+ সম্ভাব্য প্রকার, একাধিক শাখায় প্রেরণ: টাইপ সুইচ (পরবর্তী পাঠ)।
চেষ্টা করে দেখুন
i থেকে একটি স্ট্রিং বের করতে কমা ঠিক প্যাটার্ন ব্যবহার করুন।
ইঙ্গিত দেখান
সিনট্যাক্স: `v, ok := i.(T)`।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
কমা ছাড়া int-এ assertion টাইপ করুন ঠিক আছে (ধরুন আমি একটি int আছে)।
ইঙ্গিত দেখান
'ঠিক আছে' ছাড়া আপনি ধরুন ধরনটি নিশ্চিত; অন্যথায় আতঙ্কিত।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
যদি আমি একটি int ধারণ করে তাহলে `s := i.(string)` দিয়ে কি হবে?
var i interface{} = 42
s := i.(string)রিক্যাপ
v := i.(T): প্যানিক যদি গতিশীল প্রকার ≠ T.v, ok := i.(T): নিরাপদ প্যাটার্ন, চেক করুনok।- অন্য ইন্টারফেসের বিরুদ্ধেও কাজ করে ("বৈশিষ্ট্য সনাক্ত")।
Tএবং*Tদাবীর জন্য স্বতন্ত্র প্রকার।- 1 প্রকার → দাবী; 2+ প্রকার → টাইপ সুইচ।