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.
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.
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
$ go run main.go
Kodingizni ishga tushiring