মডিউল পাঠ (1/5)
ইন্টারফেস: একটি আচরণ সংজ্ঞায়িত করা
Go-তে একটি ইন্টারফেস হল পদ্ধতি স্বাক্ষরের একটি সেট। একটি মান
ইন্টারফেস প্রয়োগ করে যদি এতে সমস্ত পদ্ধতি থাকে — না
implements, না extends, কোনো স্পষ্ট নিবন্ধন নেই৷ এটা
মডেলকে প্রায়ই "স্ট্রাকচারাল টাইপিং" বা "স্ট্যাটিক ডাক টাইপিং" বলা হয়:
কম্পাইলার কম্পাইলের সময় কনফরমেন্স চেক করে, কিন্তু এর উপর ভিত্তি করে
আকার, ঘোষণার উপর নয়।
একটি ইন্টারফেস ঘোষণা
type Greeter interface {
Greet() string
}কনভেনশন: একক-পদ্ধতি ইন্টারফেসের জন্য -er এ শেষ হওয়া নামগুলি
(Reader, Writer, Stringer, Closer)। ছোট ইন্টারফেস
(1-2 পদ্ধতি) হল বাক্যপূর্ণ: স্ট্যান্ডার্ড লাইব্রেরি পূর্ণ
ছোট ইন্টারফেস যা একসাথে রচনা করে (io.ReadWriter,
io.ReadCloser, …)।
অন্তর্নিহিত বাস্তবায়ন
type Person struct{ Name string }
func (p Person) Greet() string {
return "ciao " + p.Name
}
// Person satisfies Greeter because it has the required method.
var s Greeter = Person{Name: "Ada"}
fmt.Println(s.Greet())কোন কীওয়ার্ড নেই। টাইপ পদ্ধতি আছে, এটা বরাদ্দ করা যেতে পারে যে ইন্টারফেস ধরনের একটি পরিবর্তনশীল. সেটাই।
ইন্টারফেসের মাধ্যমে পলিমরফিজম
type Robot struct{ ID string }
func (r Robot) Greet() string { return "bip " + r.ID }
func greet(s Greeter) {
fmt.Println(s.Greet())
}
greet(Person{Name: "Ada"})
greet(Robot{ID: "R2"})greet যে কোনো প্রকার গ্রহণ করে যা Greeter কে সন্তুষ্ট করে। এটাই গো পথ
পলিমরফিজম করার জন্য: কোনো শ্রেণিবিন্যাস নেই, শুধু ক্ষমতা।
খালি ইন্টারফেস
var x interface{} = 42
var y any = "ciao" // any is the built-in alias of interface{}interface{} (বা any যেহেতু Go 1.18) কোনো পদ্ধতির প্রয়োজন নেই, তাই যেকোনো
মান এটা সন্তুষ্ট. জেনেরিক পাত্রে জন্য দরকারী, কিন্তু নিষ্কাশন
কংক্রিট মান আপনার একটি টাইপ অ্যাসারশন বা টাইপ সুইচ প্রয়োজন
(পরবর্তী পাঠ)।
পদ্ধতি সেট: মান বনাম পয়েন্টার রিসিভার (প্রিভিউ)
মডিউল 5 থেকে স্মরণ করুন:
- একটি মান রিসিভার সহ পদ্ধতিগুলি
Tএবং*Tউভয়ের পদ্ধতি সেটে রয়েছে৷ - একটি পয়েন্টার রিসিভার সহ পদ্ধতিগুলি শুধুমাত্র
*Tএর পদ্ধতি সেটে রয়েছে৷
ব্যবহারিক ফলাফল:
type Counter struct{ N int }
func (c *Counter) Inc() { c.N++ }
type Incrementer interface { Inc() }
var i Incrementer = &Counter{} // OK: *Counter has Inc()
// var j Incrementer = Counter{} // ERROR: Counter (value) does NOTযখন একটি পদ্ধতিতে একটি পয়েন্টার রিসিভার থাকে, তখন আপনাকে অবশ্যই একটি পয়েন্টার বরাদ্দ করতে হবে ইন্টারফেস পরিবর্তনশীল।
চেষ্টা করে দেখুন
একটি একক পদ্ধতি Greet() স্ট্রিং দিয়ে একটি ইন্টারফেস Greeter সংজ্ঞায়িত করুন।
ইঙ্গিত দেখান
সিনট্যাক্স: `টাইপ নেম ইন্টারফেস { মেথড(আর্গস) রিটার্ন }`।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ফিল্ড আইডি স্ট্রিং সহ একটি নতুন ধরণের রোবটে গ্রিটার প্রয়োগ করুন; পদ্ধতিটি 'bip' + ID প্রদান করে।
ইঙ্গিত দেখান
কোন `ইমপ্লিমেন্টস` নেই: সঠিক স্বাক্ষর দিয়ে পদ্ধতিটি সংজ্ঞায়িত করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
আপনি কিভাবে ঘোষণা করবেন যে টাইপ P গ্রিটার ইন্টারফেস প্রয়োগ করে?
type P struct{}
// ?রিক্যাপ
- ইন্টারফেস = পদ্ধতি স্বাক্ষরের সেট; না
implements। - অন্তর্নিহিত বাস্তবায়ন: সঠিক স্বাক্ষর সহ পদ্ধতিগুলি আছে।
- ইডিওম্যাটিক: ছোট ইন্টারফেস (1-2 পদ্ধতি), নাম
-erএ। interface{}/any: যেকোনো মান গ্রহণ করে, প্রকার নিরাপত্তা হারায়।- পদ্ধতি সেট: পয়েন্টার রিসিভার → শুধুমাত্র
*Tইন্টারফেসকে সন্তুষ্ট করে। - Go polymorphism: ইন্টারফেস-টাইপ পরামিতি, কোনো শ্রেণিবিন্যাস নেই।