Accept Interfaces, Return Structs Part 1
Interfeys qabul qiling, struct qaytaring 1-qism
Go'dagi mashhur qoida: funksiyalar parametr sifatida interfeys qabul qilsin, lekin natija sifatida aniq struct qaytarsin. Bu kodni ham moslashuvchan, ham tushunarli qiladi.
package main
import (
"fmt"
"strings"
)
// Parametr — io.Reader emas, lekin xuddi shu tamoyil: eng kichik kerakli interfeys
type Named interface {
Name() string
}
type Greeting struct {
Text string
}
// Interfeys qabul qiladi — chaqiruvchi istalgan Named turini bera oladi
func Greet(n Named) Greeting {
return Greeting{Text: "Salom, " + n.Name() + "!"}
}
type Person struct{ FullName string }
func (p Person) Name() string { return p.FullName }
func main() {
g := Greet(Person{FullName: "Aziz"})
fmt.Println(g.Text)
fmt.Println(strings.ToUpper(g.Text))
}Greet(n Named) — parametr sifatida interfeys qabul qiladi, shuning uchun Name() string metodiga ega istalgan turni qabul qila oladi (moslashuvchanlik). Lekin u aniq Greeting struct'ini qaytaradi, interfeys emas — shunda chaqiruvchi natijaning barcha maydon va metodlarini to'liq ko'radi, hech narsa "yashirilmagan". Agar aksincha qilsangiz (struct qabul qilib, interfeys qaytarsangiz), kodingiz kamroq moslashuvchan va kamroq shaffof bo'lardi.
>_ Exercise
Formatter interfeysini qabul qilib, struct qaytaring.
- •Formatter interfeysi (Format() string metodi bilan) qabul qiluvchi BuildReport(f Formatter) Report funksiyasini yozing
- •Report struct'i (Text string maydoni) qaytarsin
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
"Interfeys qabul qiling, struct qaytaring" — funksiyani chaqiruvchi uchun moslashuvchan (istalgan mos turni bera oladi), natijani esa aniq va shaffof qiladi.
NEXT UP
Accept Interfaces, Return Structs Part 2: When to Break the Rules
$ go run main.go
Kodingizni ishga tushiring