আমি গো-তে ইন্টারফেসগুলি ডেটা না দিয়ে কার্যকারিতা সংজ্ঞায়িত করে তার সাথে আমি পরিচিত। আপনি একটি ইন্টারফেসে পদ্ধতির একটি সেট রেখেছেন, তবে আপনি কোনও ইন্টারফেস প্রয়োগ করে এমন কোনও ক্ষেত্র নির্দিষ্ট করতে অক্ষম।
উদাহরণ স্বরূপ:
// Interface
type Giver interface {
Give() int64
}
// One implementation
type FiveGiver struct {}
func (fg *FiveGiver) Give() int64 {
return 5
}
// Another implementation
type VarGiver struct {
number int64
}
func (vg *VarGiver) Give() int64 {
return vg.number
}
এখন আমরা ইন্টারফেস এবং এর প্রয়োগগুলি ব্যবহার করতে পারি:
// A function that uses the interface
func GetSomething(aGiver Giver) {
fmt.Println("The Giver gives: ", aGiver.Give())
}
// Bring it all together
func main() {
fg := &FiveGiver{}
vg := &VarGiver{3}
GetSomething(fg)
GetSomething(vg)
}
/*
Resulting output:
5
3
*/
এখন, আপনি যা করতে পারবেন না তা এরকম কিছু:
type Person interface {
Name string
Age int64
}
type Bob struct implements Person { // Not Go syntax!
...
}
func PrintName(aPerson Person) {
fmt.Println("Person's name is: ", aPerson.Name)
}
func main() {
b := &Bob{"Bob", 23}
PrintName(b)
}
যাইহোক, ইন্টারফেস এবং এমবেডেড স্ট্রাক্টগুলি নিয়ে ঘুরে দেখার পরে, আমি এটি করার একটি উপায় আবিষ্কার করেছি, ফ্যাশন পরে:
type PersonProvider interface {
GetPerson() *Person
}
type Person struct {
Name string
Age int64
}
func (p *Person) GetPerson() *Person {
return p
}
type Bob struct {
FavoriteNumber int64
Person
}
এম্বেড স্ট্রাক্টের কারণে, ববের কাছে ব্যক্তির সমস্ত কিছু রয়েছে। এটি পার্সনপ্রোভাইডার ইন্টারফেসও প্রয়োগ করে, তাই আমরা ববকে সেই ইন্টারফেসটি ব্যবহার করার জন্য তৈরি করা ফাংশনগুলিতে স্থান দিতে পারি।
func DoBirthday(pp PersonProvider) {
pers := pp.GetPerson()
pers.Age += 1
}
func SayHi(pp PersonProvider) {
fmt.Printf("Hello, %v!\r", pp.GetPerson().Name)
}
func main() {
b := &Bob{
5,
Person{"Bob", 23},
}
DoBirthday(b)
SayHi(b)
fmt.Printf("You're %v years old now!", b.Age)
}
এখানে একটি গো খেলার মাঠ যা উপরের কোডটি প্রদর্শন করে।
এই পদ্ধতিটি ব্যবহার করে, আমি এমন একটি ইন্টারফেস তৈরি করতে পারি যা আচরণের চেয়ে ডেটা সংজ্ঞা দেয় এবং যা কেবল কোনও ডেটা এম্বেড করে কোনও স্ট্রাক্ট দ্বারা প্রয়োগ করা যেতে পারে। আপনি এমন ফাংশনগুলি সংজ্ঞায়িত করতে পারেন যা এম্বেড হওয়া ডেটার সাথে স্পষ্টভাবে ইন্টারঅ্যাক্ট করে এবং বাহ্যিক কাঠামোর প্রকৃতি সম্পর্কে অজানা। এবং সবকিছু সংকলনের সময় চেক করা হয়! (শুধুমাত্র আপনি জগাখিচুড়ি আপ, আমি দেখতে পাচ্ছি পারে, ইন্টারফেস এম্বেডিং করা হবে PersonProvider
এ Bob
বরং একটি কংক্রিট চেয়ে Person
। এটি কম্পাইল এবং রানটাইম এ ব্যর্থ হবে।)
এখন, এখানে আমার প্রশ্ন: এটি কি একটি ঝরঝরে কৌশল, না আমার অন্যভাবে করা উচিত?