GoDasturchi
Accept Interfaces, Return Structs Part 1

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.

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

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

Hints (0/3)

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