Count Everything
Hammasini sanash
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:
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.
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
$ go run main.go
Kodingizni ishga tushiring