GoDasturchi
Count Everything

Count Everything

Hammasini sanash

example.go
hits := make(map[string]int)
for _, method := range []string{"GET", "POST", "GET", "GET", "DELETE"} {
	hits[method]++
}
// hits == map[string]int{"GET": 3, "POST": 1, "DELETE": 1}

hits[method]++ kalit mapda bo'lmaganda ham ishlaydi. Yo'q kalitni o'qish qiymat turining nol qiymatini qaytaradi, shuning uchun yangi metod uchun birinchi ++ 0 dan 1 ga o'tadi. Mavjudligini tekshirish shart emas.

Har bir kalit-qiymat juftligini olish uchun mapning o'zi ustidan ham range qilishingiz mumkin:

example.go
for path, count := range hits {
	fmt.Printf("%s: %d\n", path, count)
}

Bitta tuzoq: map iteratsiyasi tartibi tasodifiy. Bir xil kodning ikki marta ishga tushishi kalitlarni turli tartibda chop etishi mumkin. Go buni ataylab shunday qiladi, shunda siz hech qachon runtime kafolatlamaydigan tartibga tasodifan tayanmaysiz.

>_ Exercise

Siz kirish logini qayta ishlab, har bir endpoint necha marta so'ralganini bilmoqchisiz.

So'rov yo'llari slicasini qabul qilib, yo'ldan uning necha marta uchraganigacha bo'lgan mapni qaytaradigan CountVisits(paths []string) map[string]int funksiyasini yozing.

  • CountVisits([]string{"/api/users", "/healthz", "/api/users"}) map[string]int{"/api/users": 2, "/healthz": 1} qaytaradi
  • CountVisits(nil) bo'sh map qaytaradi (nil emas)
  • Bo'sh slice bo'sh map qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

counts[key]++ ko'rilmagan kalitlarda ham ishlaydi, chunki intning nol qiymati 0. Map ustidan range qilganingizda, iteratsiya tartibi har safar tasodifiy bo'ladi.

NEXT UP

Your First Struct

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Count Everything

Hammasini sanash

example.go
hits := make(map[string]int)
for _, method := range []string{"GET", "POST", "GET", "GET", "DELETE"} {
	hits[method]++
}
// hits == map[string]int{"GET": 3, "POST": 1, "DELETE": 1}

hits[method]++ kalit mapda bo'lmaganda ham ishlaydi. Yo'q kalitni o'qish qiymat turining nol qiymatini qaytaradi, shuning uchun yangi metod uchun birinchi ++ 0 dan 1 ga o'tadi. Mavjudligini tekshirish shart emas.

Har bir kalit-qiymat juftligini olish uchun mapning o'zi ustidan ham range qilishingiz mumkin:

example.go
for path, count := range hits {
	fmt.Printf("%s: %d\n", path, count)
}

Bitta tuzoq: map iteratsiyasi tartibi tasodifiy. Bir xil kodning ikki marta ishga tushishi kalitlarni turli tartibda chop etishi mumkin. Go buni ataylab shunday qiladi, shunda siz hech qachon runtime kafolatlamaydigan tartibga tasodifan tayanmaysiz.

>_ Exercise

Siz kirish logini qayta ishlab, har bir endpoint necha marta so'ralganini bilmoqchisiz.

So'rov yo'llari slicasini qabul qilib, yo'ldan uning necha marta uchraganigacha bo'lgan mapni qaytaradigan CountVisits(paths []string) map[string]int funksiyasini yozing.

  • CountVisits([]string{"/api/users", "/healthz", "/api/users"}) map[string]int{"/api/users": 2, "/healthz": 1} qaytaradi
  • CountVisits(nil) bo'sh map qaytaradi (nil emas)
  • Bo'sh slice bo'sh map qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

counts[key]++ ko'rilmagan kalitlarda ham ishlaydi, chunki intning nol qiymati 0. Map ustidan range qilganingizda, iteratsiya tartibi har safar tasodifiy bo'ladi.

NEXT UP

Your First Struct