মূল কন্টেন্টে যান
মডিউল 6 · 2-এর পাঠ 5কোর্সে 27/50~10 min
মডিউল পাঠ (2/5)

টাইপ দাবী

একটি টাইপ দাবী একটি ইন্টারফেস মান থেকে কংক্রিট টাইপ বের করে। যখন আপনার কাছে একটি interface{} (বা একটি "উচ্চ" ইন্টারফেস) থাকে তখন আপনার এটি প্রয়োজন হাত এবং ক্ষেত্রগুলি অ্যাক্সেস করার জন্য এটির নির্দিষ্ট ধরন হিসাবে এটি ব্যবহার করতে হবে বা পদ্ধতিগুলি ইন্টারফেসে উপস্থিত নয়।

সিনট্যাক্স

Go
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=truev = T এর শূন্য মান, ok=false

"কমা ঠিক আছে" ফর্ম: সবচেয়ে নিরাপদ

Go
var i interface{} = 42

if s, ok := i.(string); ok {
    fmt.Println("è stringa:", s)
} else {
    fmt.Println("non è stringa, ignoro")
}

ok আপনাকে আতঙ্ক ছাড়াই "ভুল টাইপ" কেস পরিচালনা করতে দেয়৷ এটা বেশিরভাগ ক্ষেত্রেই ইডিওম্যাটিক প্যাটার্ন।

একটি ইন্টারফেসে দাবী

দাবী শুধুমাত্র কংক্রিট ধরনের কাজ করে না, কিন্তু অন্যান্য ইন্টারফেস:

Go
type Closer interface { Close() error }

func tryClose(x interface{}) {
    if c, ok := x.(Closer); ok {
        c.Close()
    }
}

স্ট্যান্ডার্ড লাইব্রেরিতে একটি খুব সাধারণ প্যাটার্ন: "যদি আমার ইনপুটও হয় একটি io.Closer, শেষে কল বন্ধ করুন"।

পয়েন্টার বনাম মান উপর দাবী

দাবীটি অবশ্যই গতিশীল প্রকারের সাথে মিলবে:

Go
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+ সম্ভাব্য প্রকার, একাধিক শাখায় প্রেরণ: টাইপ সুইচ (পরবর্তী পাঠ)।

চেষ্টা করে দেখুন

ব্যায়াম#go.m6.l2.e1
প্রচেষ্টা: 0লোড হচ্ছে...

i থেকে একটি স্ট্রিং বের করতে কমা ঠিক প্যাটার্ন ব্যবহার করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

সিনট্যাক্স: `v, ok := i.(T)`।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m6.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

কমা ছাড়া int-এ assertion টাইপ করুন ঠিক আছে (ধরুন আমি একটি int আছে)।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

'ঠিক আছে' ছাড়া আপনি ধরুন ধরনটি নিশ্চিত; অন্যথায় আতঙ্কিত।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m6.l2.e3
প্রস্তুত

যদি আমি একটি int ধারণ করে তাহলে `s := i.(string)` দিয়ে কি হবে?

Go
var i interface{} = 42
s := i.(string)
উত্তরের বিকল্প

রিক্যাপ

  • v := i.(T): প্যানিক যদি গতিশীল প্রকার ≠ T.
  • v, ok := i.(T): নিরাপদ প্যাটার্ন, চেক করুন ok।
  • অন্য ইন্টারফেসের বিরুদ্ধেও কাজ করে ("বৈশিষ্ট্য সনাক্ত")।
  • T এবং *T দাবীর জন্য স্বতন্ত্র প্রকার।
  • 1 প্রকার → দাবী; 2+ প্রকার → টাইপ সুইচ।