GoDasturchi
Make Zero Values Useful Part 1: Ready-to-Use Types

Make Zero Values Useful Part 1: Ready-to-Use Types

Nol qiymatni foydali qiling 1-qism: darhol tayyor turlar

Go'da e'lon qilingan, lekin qiymat berilmagan o'zgaruvchi "nol qiymat"ga ega bo'ladi (0, "", nil...). Yaxshi loyihalangan turlar shu nol qiymatning o'zida ham darhol ishlatishga tayyor bo'ladi — maxsus "konstruktor" chaqirish shart emas.

example.go
package main

import (
	"bytes"
	"fmt"
	"sync"
)

type SafeCounter struct {
	mu    sync.Mutex
	count int
}

func (c *SafeCounter) Inc() {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.count++
}

func main() {
	var c SafeCounter // hech qanday "New" chaqirilmadi!
	c.Inc()
	c.Inc()
	fmt.Println(c.count)

	var buf bytes.Buffer // bu ham darhol tayyor
	buf.WriteString("tayyor")
	fmt.Println(buf.String())
}

sync.Mutex va bytes.Buffer — Go standart kutubxonasidagi "nol qiymati foydali" turlarga klassik misollar: ularni var x Mutex deb e'lon qilishning o'zi yetarli, NewMutex() degan funksiya umuman yo'q. Bu — Go'ning muhim dizayn falsafasi: agar iloji bo'lsa, foydalanuvchidan konstruktor chaqirishni talab qilmang.

>_ Exercise

Nol qiymati bilan darhol ishlaydigan Tally turini yozing.

  • Tally struct'i (bitta int maydon, Total) yarating
  • Add(n int) metodi Total'ga qo'shsin
  • var t Tally bilan (konstruktorsiz) ishlatib, ikkita Add chaqiring va Total'ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Imkon qadar, struct'laringizni nol qiymatining o'zi darhol ishlatishga tayyor bo'ladigan qilib loyihalang — bu API'ni soddalashtiradi.

NEXT UP

Make Zero Values Useful Part 2: Lazy Initialization

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Make Zero Values Useful Part 1: Ready-to-Use Types

Nol qiymatni foydali qiling 1-qism: darhol tayyor turlar

Go'da e'lon qilingan, lekin qiymat berilmagan o'zgaruvchi "nol qiymat"ga ega bo'ladi (0, "", nil...). Yaxshi loyihalangan turlar shu nol qiymatning o'zida ham darhol ishlatishga tayyor bo'ladi — maxsus "konstruktor" chaqirish shart emas.

example.go
package main

import (
	"bytes"
	"fmt"
	"sync"
)

type SafeCounter struct {
	mu    sync.Mutex
	count int
}

func (c *SafeCounter) Inc() {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.count++
}

func main() {
	var c SafeCounter // hech qanday "New" chaqirilmadi!
	c.Inc()
	c.Inc()
	fmt.Println(c.count)

	var buf bytes.Buffer // bu ham darhol tayyor
	buf.WriteString("tayyor")
	fmt.Println(buf.String())
}

sync.Mutex va bytes.Buffer — Go standart kutubxonasidagi "nol qiymati foydali" turlarga klassik misollar: ularni var x Mutex deb e'lon qilishning o'zi yetarli, NewMutex() degan funksiya umuman yo'q. Bu — Go'ning muhim dizayn falsafasi: agar iloji bo'lsa, foydalanuvchidan konstruktor chaqirishni talab qilmang.

>_ Exercise

Nol qiymati bilan darhol ishlaydigan Tally turini yozing.

  • Tally struct'i (bitta int maydon, Total) yarating
  • Add(n int) metodi Total'ga qo'shsin
  • var t Tally bilan (konstruktorsiz) ishlatib, ikkita Add chaqiring va Total'ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Imkon qadar, struct'laringizni nol qiymatining o'zi darhol ishlatishga tayyor bo'ladigan qilib loyihalang — bu API'ni soddalashtiradi.

NEXT UP

Make Zero Values Useful Part 2: Lazy Initialization