ইন্টারফেসের পয়েন্টার
প্রায় কখনই আপনার প্রয়োজন হয় না ইন্টারফেস টাইপের পয়েন্টার। আপনার অনুপ্রেরণার (value) দ্বারা ইন্টারফেস পাঠাতে হবে, এবং এই প্রক্রিয়াতে, যা data পাঠানো হচ্ছে, তা এখনও একটি পয়েন্টার হতে পারে।
উপাত্ত স্তরে ইন্টারফেস এসেসেন্শিয়ালি দুটি ফিল্ড দ্বারা প্রতিনিধিত হয়:
- কোন নির্দিষ্ট ধরণের তথ্যের পয়েন্টার। আপনি এটিকে "ধরণ" হিসাবে চিন্তা করতে পারেন।
- ডেটা পয়েন্টার। যদি সংরক্ষণের ডেটা একটি পয়েন্টার হয়, তাহলে সরাসরি সংরক্ষণ হয়। যদি সংরক্ষণের ডেটা একটি মান হয়, তবে ঐ মানের পয়েন্টারটি সংরক্ষণ হয়।
যদি আপনি চান ইন্টারফেস মেথডগুলি উপাত্তক ডাটা সম্পাদনা করে, তবে আপনাকে পয়েন্টার রিসিভার (pointer receivers) ব্যবহার করতে হবে (অবজেক্ট পয়েন্টারকে ইন্টারফেস ভেরিয়েবলে অ্যাসাইন করা হয়).
type F interface {
f()
}
type S1 struct{}
func (s S1) f() {}
type S2 struct{}
func (s *S2) f() {}
// f1.f() প্রায় পিছু করতে পারে না
// f2.f() মেমোরিত ডেটা পরিবর্তন করতে পারে, আইটেম পয়েন্টারটি ইন্টারফেস ভেরিয়েবল f2 তে অ্যাসাইন করা হয়েছে
var f1 F = S1{}
var f2 F = &S2{}
কখনই ইন্টারফেসের পয়েন্টার ব্যবহার করা যাবে না, এটি বিহত। Go ভাষায়, ইন্টারফেস বাস্তবে একটি রেফারেন্স টাইপ। অন্যদিকে, ইন্টারফেস টাইপ নিজভূত পয়েন্টার। আমার প্রয়োজনে, পরীক্ষার জন্য প্যারামিটার হল myinterface, এবং আমি শুধুমাত্র মাত্র mystruct টাইপ (এবং মান পার করতে হবে) পাস করতে পারি।
type myinterface interface{
print()
}
func test(value *myinterface){
// কিছু করতে হবে ...
}
type mystruct struct {
i int
}
// ইন্টারফেস অমল করুন
func (this *mystruct) print(){
fmt.Println(this.i)
this.i=1
}
func main(){
m := &mystruct{0}
test(m) // ভুল
test(*m) // ভুল
}