GoDasturchi
Aggregations

Aggregations

Statistika (Aggregations)

"Bugun nechta ERROR bo'ldi?" yoki "qaysi servis eng ko'p log yozdi?" — bu savollarga javob berish uchun HAR BIR log yozuvini QO'LDA sanash SHART emas. Aggregation (statistikaga guruhlash) — ko'plab log yozuvini, ma'lum bir MEZON bo'yicha (masalan Level yoki Service) GURUHLAB, har bir guruhning SONINI hisoblab beradi.

example.go
package main

import (
	"fmt"
	"sort"
)

type LogEntry struct {
	Level   string
	Service string
}

// CountByLevel — har bir Level bo'yicha nechta log borligini hisoblaydi
func CountByLevel(entries []LogEntry) map[string]int {
	counts := make(map[string]int)
	for _, entry := range entries {
		counts[entry.Level]++
	}
	return counts
}

func main() {
	entries := []LogEntry{
		{Level: "ERROR", Service: "payments"},
		{Level: "INFO", Service: "payments"},
		{Level: "ERROR", Service: "auth"},
		{Level: "ERROR", Service: "payments"},
	}

	counts := CountByLevel(entries)

	var levels []string
	for level := range counts {
		levels = append(levels, level)
	}
	sort.Strings(levels)

	for _, level := range levels {
		fmt.Println(level, counts[level])
	}
}

counts[entry.Level]++ — "Maps as Counters" naqshi: agar kalit hali XARITADA yo'q bo'lsa, Go AVTOMATIK uni nolga tenglashtirib, keyin 1 qo'shadi ("Zero Values" darsini eslang) — qo'shimcha if tekshiruvi KERAK EMAS. Bu — bir marta BUTUN ro'yxat bo'ylab yurib, BARCHA guruhlarning sonini BIRDANIGA hisoblab chiqadigan, samarali usul.

Diqqat qiling: natijani chop etishdan OLDIN, kalitlar (levels) sort.Strings bilan TARTIBLANADI — bu "Iterating over Maps" darsida ko'rgan MUHIM eslatma: Go xaritasining ITERATSIYA tartibi HAR SAFAR BOSHQACHA bo'lishi mumkin, shuning uchun DETERMINISTIK (bashorat qilinadigan) natija kerak bo'lganda, har doim ALOHIDA tartiblash kerak.

>_ Exercise

Service bo'yicha guruhlab, ENG KO'P log yozgan servisni toping.

  • CountByService(entries []LogEntry) map[string]int funksiyasini yozing (CountByLevel bilan bir xil naqsh, lekin entry.Service bo'yicha)
  • TopService(counts map[string]int) string funksiyasini yozing: eng katta qiymatga ega kalitni qaytaring (teng bo'lsa, istalgani bo'lishi mumkin)
  • berilgan entries uchun CountByService chaqirib, TopService natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Aggregation funksiyalari (CountByLevel, CountByService) loglarni ma'lum mezon bo'yicha guruhlab, ular ustida statistik savollarga (eng ko'p, eng kam) tez javob berish imkonini beradi.

NEXT UP

REST API

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Aggregations

Statistika (Aggregations)

"Bugun nechta ERROR bo'ldi?" yoki "qaysi servis eng ko'p log yozdi?" — bu savollarga javob berish uchun HAR BIR log yozuvini QO'LDA sanash SHART emas. Aggregation (statistikaga guruhlash) — ko'plab log yozuvini, ma'lum bir MEZON bo'yicha (masalan Level yoki Service) GURUHLAB, har bir guruhning SONINI hisoblab beradi.

example.go
package main

import (
	"fmt"
	"sort"
)

type LogEntry struct {
	Level   string
	Service string
}

// CountByLevel — har bir Level bo'yicha nechta log borligini hisoblaydi
func CountByLevel(entries []LogEntry) map[string]int {
	counts := make(map[string]int)
	for _, entry := range entries {
		counts[entry.Level]++
	}
	return counts
}

func main() {
	entries := []LogEntry{
		{Level: "ERROR", Service: "payments"},
		{Level: "INFO", Service: "payments"},
		{Level: "ERROR", Service: "auth"},
		{Level: "ERROR", Service: "payments"},
	}

	counts := CountByLevel(entries)

	var levels []string
	for level := range counts {
		levels = append(levels, level)
	}
	sort.Strings(levels)

	for _, level := range levels {
		fmt.Println(level, counts[level])
	}
}

counts[entry.Level]++ — "Maps as Counters" naqshi: agar kalit hali XARITADA yo'q bo'lsa, Go AVTOMATIK uni nolga tenglashtirib, keyin 1 qo'shadi ("Zero Values" darsini eslang) — qo'shimcha if tekshiruvi KERAK EMAS. Bu — bir marta BUTUN ro'yxat bo'ylab yurib, BARCHA guruhlarning sonini BIRDANIGA hisoblab chiqadigan, samarali usul.

Diqqat qiling: natijani chop etishdan OLDIN, kalitlar (levels) sort.Strings bilan TARTIBLANADI — bu "Iterating over Maps" darsida ko'rgan MUHIM eslatma: Go xaritasining ITERATSIYA tartibi HAR SAFAR BOSHQACHA bo'lishi mumkin, shuning uchun DETERMINISTIK (bashorat qilinadigan) natija kerak bo'lganda, har doim ALOHIDA tartiblash kerak.

>_ Exercise

Service bo'yicha guruhlab, ENG KO'P log yozgan servisni toping.

  • CountByService(entries []LogEntry) map[string]int funksiyasini yozing (CountByLevel bilan bir xil naqsh, lekin entry.Service bo'yicha)
  • TopService(counts map[string]int) string funksiyasini yozing: eng katta qiymatga ega kalitni qaytaring (teng bo'lsa, istalgani bo'lishi mumkin)
  • berilgan entries uchun CountByService chaqirib, TopService natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Aggregation funksiyalari (CountByLevel, CountByService) loglarni ma'lum mezon bo'yicha guruhlab, ular ustida statistik savollarga (eng ko'p, eng kam) tez javob berish imkonini beradi.

NEXT UP

REST API