Define Interfaces Where Used
Interfeyslarni ishlatilgan joyda e'lon qiling
Go'da odat: interfeysni uni amalga oshiruvchi paket emas, uni ishlatuvchi (chaqiruvchi) paket e'lon qiladi. Bu boshqa ko'p tillardagi "avval interfeys, keyin implementatsiya" tartibiga teskari.
package main
import "fmt"
// "Ishlatuvchi" tomon: bu funksiyaga nima kerakligini
// aynan shu funksiya belgilaydi — kichik, faqat kerakli metod bilan
type nameGetter interface {
Name() string
}
func welcome(n nameGetter) string {
return "Xush kelibsiz, " + n.Name() + "!"
}
// "Amalga oshiruvchi" tomon: bu tur hech qanday interfeysni "bilishi" shart emas
type Employee struct {
FullName string
Salary int
}
func (e Employee) Name() string { return e.FullName }
func main() {
fmt.Println(welcome(Employee{FullName: "Aziz", Salary: 5000000}))
}Employee turi nameGetter interfeysi haqida hech narsa bilmaydi — u shunchaki Name() string metodiga ega, va Go buni avtomatik moslashtiradi ("Interfaces & Polymorphism" kursida ko'rgan yashirin — implicit — amalga oshirish). Interfeysni ishlatuvchi funksiya joylashgan joyda, unga aynan nima kerakligini aniq belgilab e'lon qilish — kodni yaxshi tuzilmalashtirilgan qiladi va katta, umumiy interfeyslar yaratishning oldini oladi.
>_ Exercise
Ishlatuvchi funksiyaga mos, kichik interfeys yozing.
- •priceGetter interfeysini (faqat Price() int metodi bilan) e'lon qiling
- •totalWithTax(p priceGetter) int funksiyasini yozing: Price()*110/100 qaytarsin
- •Item struct'i (Price() metodi bilan) yarating va chaqirib ko'ring
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Interfeysni uni ishlatadigan funksiya joylashgan joyda, aynan shu funksiyaga kerakli metodlar bilan e'lon qiling — implementatsiya turi bu haqda bilishi shart emas.
NEXT UP
Don't Return Interfaces
$ go run main.go
Kodingizni ishga tushiring