Interface Basics: Defining Behavior
Interfeys asoslari: xatti-harakatni belgilash
Shu paytgacha siz aniq turlar bilan ishladingiz: Product, DNSRecord, CacheEntry — har biri qat'iy maydonlarga ega struct edi. Interfeys boshqacha savol beradi: "bu qiymat *nima ega* emas, balki *nima qila oladi*?" Interfeys — metodlar to'plamining nomi, xolos.
type Shaper interface {
Area() float64
}Bu shuni bildiradi: "Area() float64 metodiga ega bo'lgan har qanday tur — Shaperdir". E'tibor bering: hech qanday implements Shaper deb yozish shart emas — Go'da interfeys yashirin (implicit) amalga oshiriladi. Agar tur kerakli metodlarga ega bo'lsa, u avtomatik ravishda o'sha interfeysga mos keladi.
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// Rectangle endi Shaper interfeysiga mos keladi — buni alohida e'lon qilish shart emas.Bu — Pointers & Memory kursidagi receiver'lar g'oyasining davomi: metod — bu shunchaki turga bog'langan funksiya. Interfeys esa turli xil receiver'larga ega turlarni bitta umumiy nom ostida birlashtirish imkonini beradi. Bir xil []Shaper slice'i ichida ham Rectangle, ham Circle yashashi mumkin — ularning yagona umumiyligi Area() metodiga ega ekanligi.
>_ Exercise
Area() float64 metodiga ega Shaper interfeysi berilgan. Rectangle{Width, Height float64} va Circle{Radius float64} struct'larini aniqlang va ikkalasi uchun ham Area() metodini yozing (Circle uchun 3.14159 * r * r formulasidan foydalaning). So'ngra TotalArea(shapes []Shaper) float64 funksiyasini yozing — u berilgan barcha shakllar yuzasining yig'indisini qaytaradi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Interfeys — metodlar to'plamining nomi, xolos. Go'da amalga oshirish yashirin: agar tur kerakli metodlarga ega bo'lsa, u avtomatik ravishda o'sha interfeysga mos keladi. Bu turli xil struct'larni (Rectangle, Circle) bitta umumiy []Shaper slice'ida birlashtirish imkonini beradi.
NEXT UP
Standard Library Interfaces: io.Reader
$ go run main.go
Kodingizni ishga tushiring