GoDasturchi
Make Zero Values Useful Part 2: Lazy Initialization

Make Zero Values Useful Part 2: Lazy Initialization

Nol qiymatni foydali qiling 2-qism: dangasa ishga tushirish

Ba'zi turlar (masalan map) nol qiymatida to'liq ishlamaydi — nil map'ga yozish dasturni qulatadi. Bunday holatlarda "dangasa ishga tushirish" (lazy initialization) naqshi ishlatiladi: haqiqatan kerak bo'lgandagina ichki ma'lumotni yaratish.

example.go
package main

import "fmt"

type Cache struct {
	data map[string]int
}

func (c *Cache) Get(key string) (int, bool) {
	v, ok := c.data[key] // nil map'dan o'qish xavfsiz — 0, false qaytaradi
	return v, ok
}

func (c *Cache) Set(key string, value int) {
	if c.data == nil {
		c.data = make(map[string]int) // faqat kerak bo'lganda yaratiladi
	}
	c.data[key] = value
}

func main() {
	var c Cache
	v, ok := c.Get("missing")
	fmt.Println(v, ok)

	c.Set("age", 21)
	v2, ok2 := c.Get("age")
	fmt.Println(v2, ok2)
}

Muhim farq: nil map'dan o'qish xavfsiz (bo'sh natija qaytaradi), lekin nil map'ga yozish dasturni qulatadi (panic: assignment to entry in nil map). Shuning uchun Set metodida yozishdan oldin if c.data == nil { c.data = make(...) } tekshiruvi qo'yiladi — bu "dangasa ishga tushirish": xarita faqat birinchi marta haqiqatan yozilganda yaratiladi.

>_ Exercise

Log to'plovchi uchun dangasa ishga tushirishni qo'llang.

  • Logger struct'ida entries []string maydoni bor
  • Add(msg string) metodida entries nil bo'lsa uni ishga tushiring, so'ng append qiling
  • var l Logger bilan (konstruktorsiz) ikkita xabar qo'shib, len(l.entries) ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Nil map'ga yozish xavfli (panic beradi), nil slice'ga append esa xavfsiz — lekin ikkalasida ham "kerak bo'lgandagina yaratish" naqshi kodni ishonchli qiladi.

NEXT UP

Accept Interfaces, Return Structs Part 1

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Make Zero Values Useful Part 2: Lazy Initialization

Nol qiymatni foydali qiling 2-qism: dangasa ishga tushirish

Ba'zi turlar (masalan map) nol qiymatida to'liq ishlamaydi — nil map'ga yozish dasturni qulatadi. Bunday holatlarda "dangasa ishga tushirish" (lazy initialization) naqshi ishlatiladi: haqiqatan kerak bo'lgandagina ichki ma'lumotni yaratish.

example.go
package main

import "fmt"

type Cache struct {
	data map[string]int
}

func (c *Cache) Get(key string) (int, bool) {
	v, ok := c.data[key] // nil map'dan o'qish xavfsiz — 0, false qaytaradi
	return v, ok
}

func (c *Cache) Set(key string, value int) {
	if c.data == nil {
		c.data = make(map[string]int) // faqat kerak bo'lganda yaratiladi
	}
	c.data[key] = value
}

func main() {
	var c Cache
	v, ok := c.Get("missing")
	fmt.Println(v, ok)

	c.Set("age", 21)
	v2, ok2 := c.Get("age")
	fmt.Println(v2, ok2)
}

Muhim farq: nil map'dan o'qish xavfsiz (bo'sh natija qaytaradi), lekin nil map'ga yozish dasturni qulatadi (panic: assignment to entry in nil map). Shuning uchun Set metodida yozishdan oldin if c.data == nil { c.data = make(...) } tekshiruvi qo'yiladi — bu "dangasa ishga tushirish": xarita faqat birinchi marta haqiqatan yozilganda yaratiladi.

>_ Exercise

Log to'plovchi uchun dangasa ishga tushirishni qo'llang.

  • Logger struct'ida entries []string maydoni bor
  • Add(msg string) metodida entries nil bo'lsa uni ishga tushiring, so'ng append qiling
  • var l Logger bilan (konstruktorsiz) ikkita xabar qo'shib, len(l.entries) ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Nil map'ga yozish xavfli (panic beradi), nil slice'ga append esa xavfsiz — lekin ikkalasida ham "kerak bo'lgandagina yaratish" naqshi kodni ishonchli qiladi.

NEXT UP

Accept Interfaces, Return Structs Part 1