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

টাইপ সুইচ

একটি টাইপ সুইচ একাধিক সম্ভাব্য প্রকারের মধ্যে বৈষম্য করে ইন্টারফেস মান। এটি comma ok এর সাধারণীকরণ যখন সেখানে থাকে৷ একাধিক মামলা।

সিনট্যাক্স

Go
func describe(i interface{}) string {
    switch v := i.(type) {
    case int:
        return fmt.Sprintf("int %d", v)
    case string:
        return fmt.Sprintf("string %q", v)
    case nil:
        return "nil"
    default:
        return fmt.Sprintf("altro tipo: %T", v)
    }
}
  • i.(type) হল একটি বিশেষ সিনট্যাক্স, শুধুমাত্র switch এর মধ্যেই বৈধ।
  • v := ... বর্তমান কেসের প্রকারের সাথে মানটিকে আবদ্ধ করে: ভিতরে case int, v এর টাইপ আছে int।
  • default অন্য সব ধরনের ক্যাচ করে; সেখানে v এর মূল ইন্টারফেসের ধরন রয়েছে।
  • case nil একটি শূন্য গতিশীল প্রকারের সাথে ইন্টারফেসের সাথে মেলে৷

"নামহীন" মামলা

যদি আপনার টাইপ করা মান প্রয়োজন না হয়, আপনি v বাদ দিতে পারেন:

Go
switch i.(type) {
case int:
    // you know it's an int, but you don't have a variable of that type
case string:
    // ...
}

একটি ফর্ম ব্যবহার করা হয় যখন আপনি শুধুমাত্র টাইপ বৈষম্য প্রয়োজন, পরিচালনা না মান উপর.

একই ক্ষেত্রে একাধিক প্রকার

Go
switch v := i.(type) {
case int, int64:
    // here v is still interface{}: the "common" type is just the interface
    fmt.Println("numero intero:", v)
case string:
    // here v is string
    fmt.Println("stringa:", v)
}

সাধারণ ব্যবহারের ক্ষেত্রে: বিন্যাসিত মুদ্রণ

Go
func print(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("%d\n", v)
    case string:
        fmt.Printf("%s\n", v)
    case fmt.Stringer:
        fmt.Println(v.String())
    default:
        fmt.Printf("%v\n", v)
    }
}

fmt.Println নিজেই পরিচালনা করতে অভ্যন্তরীণভাবে একটি টাইপ সুইচ ব্যবহার করে৷ স্ট্যান্ডার্ড ফরম্যাট।

টাইপ সুইচ বনাম প্রতিফলন

কয়েকটি পরিচিত প্রকারের জন্য → টাইপ সুইচ (দ্রুত, পঠনযোগ্য)। অজানা প্রকারের গতিশীল পরিদর্শনের জন্য → reflect প্যাকেজ (আরো শক্তিশালী কিন্তু ধীর এবং আরো শব্দযুক্ত)।

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

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

ডায়নামিক টাইপের উপর নির্ভর করে 'int', 'স্ট্রিং' বা 'altro' প্রদানকারী বর্ণনা (i ইন্টারফেস{}) স্ট্রিং প্রয়োগ করুন।

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

সিনট্যাক্স: `switch i.(type) { case T: ... ডিফল্ট: ... }`।

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

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

লিখুন printVal(i ইন্টারফেস{}) যা v := i.(টাইপ) ব্যবহার করে এবং int-এর জন্য %d, স্ট্রিং-এর জন্য %s দিয়ে প্রিন্ট করে।

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

`case int`-এর ভিতরে, v-এর টাইপ আছে int (আপনি এটি Printf-এ পাঠাতে পারেন)।

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

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

কোন সিনট্যাক্স একটি টাইপ সুইচ শুরু করে?

Go
switch ??? {
  case int: ...
}
উত্তরের বিকল্প

রিক্যাপ

  • switch v := i.(type) { case T: ... }: গতিশীল প্রকারের উপর বৈষম্য করে।
  • একটি একক-টাইপ কেসের ভিতরে, v কেসের ধরন আছে৷
  • case T1, T2: v মূল ইন্টারফেসের ধরন রাখে।
  • default আন-হ্যান্ডেল করা ক্ষেত্রে; case nil শূন্য ইন্টারফেসের জন্য।
  • টাইপ সুইচগুলিতে fallthrough নেই৷
  • 1 প্রকার → প্রকার দাবী; 2+ প্রকার → টাইপ সুইচ।