GoDasturchi
Define Interfaces Where Used

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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