Go-তে Interface এর মৌলিক ধারণা
১. Interface কি?
Go তে interface একটি ধরনের ডেটা টাইপ যা একটি সেট ফাংশনের সিগনেচার বা কনট্রাক্ট (contract) নির্ধারণ করে। এটি মূলত পদ্ধতিগুলির (methods)集合, যা একটি ধরনের আচরণকে বর্ণনা করে। একটি টাইপ যদি একটি interface এর সব পদ্ধতি সম্পন্ন করে, তবে সেটি ঐ interface টাইপের উপযুক্ত হবে, এবং সেই টাইপটি implicit (স্পষ্টভাবে ঘোষণা না করেও) ঐ interface এর অংশ হয়ে যাবে।
এটা মনে রাখতে হবে যে Go তে interface ব্যবহারের জন্য কোনো টাইপকে এক্সপ্লিসিটভাবে তার পদ্ধতিগুলি বাস্তবায়ন করতে হয় না। যদি কোনো টাইপ একটি interface-এ থাকা সব পদ্ধতি বাস্তবায়ন করে, তবে সেটি ঐ interface-কে অপেক্ষা করে অর্থাৎ, টাইপটি সেই interface কে প্রাপ্ত হয়।
২. Interface ডিক্লারেশন
Go তে একটি interface ডিক্লেয়ার করার জন্য type কিওয়ার্ড ব্যবহার করা হয়। এর সাধারণ সিনট্যাক্স হলো:
type InterfaceName interface {
Method1()
Method2(paramType) returnType
// আরও পদ্ধতি থাকতে পারে
}এখানে:
InterfaceName: interface এর নামMethod1,Method2: interface এর পদ্ধতি যা টাইপের মাধ্যমে বাস্তবায়ন করা হবে
২.১ Interface ডিক্লেয়ার করার উদাহরণ
package main
import "fmt"
// Interface ডিক্লেয়ার করা
type Speaker interface {
Speak() // Speak নামক পদ্ধতি
}
type Person struct {
Name string
}
// Person struct এর জন্য Speak পদ্ধতি বাস্তবায়ন করা
func (p Person) Speak() {
fmt.Println("Hello, my name is", p.Name)
}
func main() {
p := Person{Name: "John"}
var s Speaker = p // Person টাইপ Speaker interface এর জন্য উপযুক্ত
s.Speak() // আউটপুট: Hello, my name is John
}এখানে, Speaker একটি interface যা একটি Speak পদ্ধতি ধারণ করে। Person struct এই পদ্ধতি বাস্তবায়ন করেছে, এবং তাই Person টাইপটি Speaker interface এর অংশ হয়ে উঠেছে। s নামক interface পরিবর্তনশীলটি Person টাইপের ইনস্ট্যান্স ধারণ করে এবং Speak() পদ্ধতি কল করা হয়।
৩. Interface এবং Method Implementation
Go তে interface এর মাধ্যমে পদ্ধতির বাস্তবায়ন খুবই সরল। কোন পদ্ধতি একটি interface দ্বারা ধার্য করা হলে, সেই পদ্ধতিটি টাইপে বাস্তবায়ন করলেই ঐ টাইপ স্বয়ংক্রিয়ভাবে ঐ interface এর অংশ হয়ে যায়। Go তে explicit declaration এর দরকার নেই, যেটি অন্যান্য ভাষায় সাধারণত হয়।
৩.১ Method Implementation Example
package main
import "fmt"
// Interface ডিক্লেয়ার করা
type Printer interface {
Print() string
}
type Book struct {
Title string
Author string
}
// Book টাইপের জন্য Print পদ্ধতি বাস্তবায়ন করা
func (b Book) Print() string {
return "Title: " + b.Title + ", Author: " + b.Author
}
func main() {
b := Book{Title: "Go Programming", Author: "John Doe"}
var p Printer = b // Book টাইপ Printer interface এর জন্য উপযুক্ত
fmt.Println(p.Print()) // আউটপুট: Title: Go Programming, Author: John Doe
}এখানে, Printer interface একটি Print পদ্ধতি ধারণ করে। Book struct এই পদ্ধতি বাস্তবায়ন করেছে, এবং তাই Book টাইপটি Printer interface এর অংশ হয়ে গেছে। p interface এর মাধ্যমে Book টাইপের Print পদ্ধতি কল করা হয়েছে।
৪. Empty Interface
Go তে একটি empty interface হল এমন একটি interface যা কোনো পদ্ধতি ধারণ করে না। এটি সব ধরনের টাইপের জন্য উপযুক্ত, কারণ প্রত্যেকটি টাইপ কোনো না কোনোভাবে তার নিজস্ব পদ্ধতি সম্পন্ন করবে না। তাই এটি সব ধরনের ভ্যালু ধারণ করতে সক্ষম।
৪.১ Empty Interface উদাহরণ
package main
import "fmt"
func printValue(i interface{}) {
fmt.Println(i)
}
func main() {
printValue(42) // আউটপুট: 42
printValue("Hello, World!") // আউটপুট: Hello, World!
printValue(true) // আউটপুট: true
}এখানে, printValue ফাংশনে interface{} ব্যবহার করা হয়েছে, যা কোনো ধরনের ডেটা গ্রহন করতে পারে। এটি একটি empty interface, এবং তাই এটা যেকোনো টাইপের মান পাস করতে সক্ষম।
৫. Type Assertion
Go তে Type Assertion ব্যবহার করে, আপনি interface এর মধ্যে থাকা প্রকৃত টাইপ (concrete type) খুঁজে পেতে পারেন। এটি বিশেষভাবে ব্যবহার করা হয় যখন আপনাকে interface থেকে নির্দিষ্ট টাইপের ডেটা বের করতে হয়।
৫.১ Type Assertion উদাহরণ
package main
import "fmt"
type Speaker interface {
Speak() string
}
type Person struct {
Name string
}
func (p Person) Speak() string {
return "Hello, my name is " + p.Name
}
func main() {
var s Speaker = Person{Name: "Alice"}
// Type assertion
p, ok := s.(Person) // Interface থেকে Person টাইপ বের করা
if ok {
fmt.Println(p.Name) // আউটপুট: Alice
} else {
fmt.Println("Type assertion failed")
}
}এখানে, আমরা s.(Person) দিয়ে Speaker interface থেকে Person টাইপ বের করার চেষ্টা করেছি। যদি assertion সফল হয়, তাহলে ok true হয়ে যাবে এবং p.Name প্রিন্ট হবে।
সারসংক্ষেপ
- Interface: Go তে interface হল এমন একটি ডেটা টাইপ যা একটি সেট পদ্ধতির সিগনেচার ধারণ করে। একটি টাইপ যদি interface এর সব পদ্ধতি বাস্তবায়ন করে, তবে ঐ টাইপটি সেই interface এর অংশ হয়ে যায়।
- Method Implementation: Go তে কোনো টাইপ একটি interface-এ থাকা পদ্ধতি বাস্তবায়ন করলে, টাইপটি স্বয়ংক্রিয়ভাবে ঐ interface এর অংশ হয়ে যায়।
- Empty Interface:
interface{}হলো এমন একটি interface যা সব ধরনের ডেটা ধারণ করতে পারে, এবং এটি সর্বাধিক ব্যবহৃত interface। - Type Assertion:
Type assertionব্যবহার করে, আপনি interface-এর মধ্যে থাকা প্রকৃত টাইপ বের করতে পারেন।
Go তে interface একটি অত্যন্ত শক্তিশালী ধারণা, যা polymorphism এবং abstraction এর মাধ্যমে আপনার কোডকে আরও নমনীয় এবং পুনঃব্যবহারযোগ্য করে তোলে।
Read more