Go-তে ভিন্ন ভিন্ন টাইপের মধ্যে রূপান্তর সবসময় স্পষ্টভাবে লিখতে হয়।
টাইপের মধ্যে রূপান্তর (যা টাইপ কাস্টিং নামেও পরিচিত) করা হয় কোন টাইপে রূপান্তর করতে চান, সেই টাইপের নামে একটি ফাংশন দিয়ে।
যেমন, একটি int-কে float64-তে রূপান্তর করতে হলে আপনাকে নিচের কাজটি করতে হবে:
var x int = 42 // x has type int
f := float64(x) // f has type float64 (ie. 42.0)
প্রিমিটিভ টাইপ (যেমন int) আর string-এর মধ্যে রূপান্তরের জন্য একটি strconv প্যাকেজ আছে।
import "strconv"
var intString string = "42"
var i, err = strconv.Atoi(intString)
var number int = 12
var s string = strconv.Itoa(number)
Go-তে ইন্টারফেস ব্যবহার করলে অন্তর্নিহিত টাইপ নিয়ে অস্পষ্টতা তৈরি হতে পারে।
টাইপ অ্যাসারশনের সাহায্যে আমরা এই সিনট্যাক্স ব্যবহার করে ইন্টারফেস ভ্যালুর অন্তর্নিহিত কংক্রিট মান বের করতে পারি: interfaceVariable.(concreteType)।
যেমন:
var input any = 12
number := input.(int)
লক্ষ্য করুন: ইন্টারফেস ভ্যারিয়েবলে যদি কংক্রিট টাইপের কোনো মান না থাকে, তাহলে এটি একটি প্যানিক তৈরি করবে।
টাইপ অ্যাসারশনের দুইটি রিটার্ন ভ্যালু কাজে লাগিয়ে আমরা পরীক্ষা করতে পারি একটি ইন্টারফেস ভ্যালুতে নির্দিষ্ট কোনো কংক্রিট টাইপ আছে কি না: অন্তর্নিহিত মান, আর একটি বুলিয়ান মান যা জানায় অ্যাসারশনটি সফল হয়েছে কি না। যেমন:
str, ok := input.(string) // no panic if input is not a string
যদি input-এ একটি string থাকে, তাহলে str হবে অন্তর্নিহিত মান এবং ok হবে ট্রু।
যদি input-এ string না থাকে, তাহলে str হবে string টাইপের জিরো মান (অর্থাৎ "", খালি স্ট্রিং) এবং ok হবে ফলস।
যেকোনো ক্ষেত্রেই কোনো প্যানিক হয় না।
একটি টাইপ সুইচ পরপর কয়েকটি টাইপ অ্যাসারশন করতে পারে।
এর সিনট্যাক্স টাইপ অ্যাসারশনের মতোই (interfaceVariable.(concreteType)), তবে concreteType-এর জায়গায় বসে type কিওয়ার্ডটি।
নিচে একটি উদাহরণ দেওয়া হলো:
var i any = 12 // try: 12.3, true, int64(12), []int{}, map[string]int{}
switch v := i.(type) {
case int:
fmt.Printf("the integer %d\n", v)
case string:
fmt.Printf("the string %s\n", v)
default:
fmt.Printf("type, %T, not handled explicitly: %#v\n", v, v)
}
জেন একটি বড় কারখানার বাছাই কক্ষে কাজ করছেন। বাছাই কক্ষে যা-ই আসুক, সেটিকে একটি লেবেল দিয়ে শ্রেণীবদ্ধ করে প্রসেস করতে হয়। আগেই যেসব জিনিস সংখ্যা হিসেবে শ্রেণীবদ্ধ করা হয়েছে, সেগুলোর দায়িত্ব জেনের, আর বাছাইয়ের কাজে সাহায্যের জন্য তাঁর একটি প্রোগ্রাম দরকার।
বেশিরভাগ প্রিমিটিভ মান সরল লেবেল পাওয়া উচিত।
সংখ্যার জন্য তিনি এমন স্ট্রিং চান যেখানে লেখা থাকবে "This is the number 2.0" (সংখ্যাটি যদি 2 হয়)।
ইন্টিজার আর ফ্লোট, দুটোর জন্যই জেন একই আউটপুট চান।
কয়েকটি Box ইন্টারফেস আছে, যেগুলোর ভেতরের জিনিস পেতে হলে সেগুলো আনর্যাপ করতে হয়।
NumberBox টাইপের জন্য তিনি এমন স্ট্রিং চান যেখানে লেখা থাকবে "This is a box containing the number 3.0" (Number() মেথডটি যদি 3 রিটার্ন করে)।
FancyNumberBox টাইপের জন্য তিনি এমন স্ট্রিং চান যেখানে লেখা থাকবে "This is a fancy box containing the number 4.0", তবে কেবল যদি টাইপটি FancyNumber হয়।
অপ্রত্যাশিত যেকোনো কিছু "Return to sender" বলা উচিত, যাতে জেন সেগুলো যেখান থেকে এসেছে সেখানে ফেরত পাঠাতে পারেন।
জেন চান সংখ্যাগুলো এমন স্ট্রিং রিটার্ন করুক যেখানে লেখা থাকবে "This is the number 2.0" (দশমিকের পরে একটি ডিজিটসহ):
fmt.Println(DescribeNumber(-12.345))
// Output: This is the number -12.3
জেন চান নাম্বার বক্সগুলো এমন স্ট্রিং রিটার্ন করুক যেখানে লেখা থাকবে "This is a box containing the number 2.0" (আবারও দশমিকের পরে একটি ডিজিটসহ):
fmt.Println(DescribeNumberBox(numberBoxContaining{12}))
// Output: This is a box containing the number 12.0
জেনের একটি FancyNumberBox থেকে সংখ্যাটি বের করার জন্য একটি হেল্পার ফাংশন দরকার।
যদি FancyNumberBox টাইপটি FancyNumber হয়, তাহলে তার মান বের করে সেটিকে string থেকে int টাইপে রূপান্তর করুন।
অন্য যেকোনো ধরনের FancyNumberBox 0 রিটার্ন করবে।
fmt.Println(ExtractFancyNumber(FancyNumber{"10"}))
// Output: 10
fmt.Println(ExtractFancyNumber(AnotherFancyNumber{"4"}))
// Output: 0
যদি FancyNumberBox টাইপটি FancyNumber হয়, তাহলে জেন এমন স্ট্রিং চান যেখানে লেখা থাকবে "This is a fancy box containing the number 4.0"।
অন্য যেকোনো ধরনের FancyNumberBox হলে লেখা থাকবে "This is a fancy box containing the number 0.0"।
fmt.Println(DescribeFancyNumberBox(FancyNumber{"10"}))
// Output: This is a fancy box containing the number 10.0
fmt.Println(DescribeFancyNumberBox(AnotherFancyNumber{"4"}))
// Output: This is a fancy box containing the number 0.0
দ্রষ্টব্য: আমাদের ExtractFancyNumber ফাংশনটি ব্যবহার করা উচিত!
DescribeAnything তৈরি করুন, যা এদের সবগুলো ব্যবহার করেএটি জেনের প্রয়োজনীয় মূল ফাংশন, যা যেকোনো ইনপুট নেয়।
DescribeAnything ফাংশনটিকে পাস করা মানের টাইপ অনুযায়ী অন্য ফাংশনগুলোতে ডেলিগেট করতে হবে।
আরও নির্দিষ্টভাবে:
int আর float64 দুটোই DescribeNumber ফাংশনে ডেলিগেট করবেNumberBox DescribeNumberBox ফাংশনে ডেলিগেট করবেFancyNumberBox DescribeFancyNumberBox ফাংশনে ডেলিগেট করবে"Return to sender"
fmt.Println(DescribeAnything(numberBoxContaining{12.345}))
// Output: This is a box containing the number 12.3
fmt.Println(DescribeAnything("some string"))
// Output: Return to sender
Exercism-এ সাইন আপ করুন, Go ট্র্যাকের 34টি কনসেপ্ট166টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।