package main import ( "bytes" "encoding/json" "fmt" "time" ) type send struct { Payload string Number int64 Operation string } //ZabovStats is used to keep statistics to print var ZabovStats map[string]int64 var stats chan send func init() { stats = make(chan send, 1024) ZabovStats = make(map[string]int64) fmt.Println("Initializing stats engine.") go reportPrintThread() go statsThread() } func statsPrint() { fmt.Println() stat, _ := json.Marshal(ZabovStats) fmt.Println(jsonPrettyPrint(string(stat))) fmt.Println() } func incrementStats(key string, value int64) { var s send s.Payload = key s.Number = value s.Operation = "INC" stats <- s } func setstatsvalue(key string, value int64) { var s send s.Payload = key s.Number = value s.Operation = "SET" stats <- s } func reportPrintThread() { for { var s send s.Operation = "PRI" s.Payload = "-" s.Number = 0 stats <- s time.Sleep(2 * time.Minute) } } func statsThread() { fmt.Println("Starting Statistical Collection Thread") for item := range stats { switch item.Operation { case "INC": ZabovStats[item.Payload] += item.Number case "SET": ZabovStats[item.Payload] = item.Number case "PRI": statsPrint() } } } func jsonPrettyPrint(in string) string { var out bytes.Buffer err := json.Indent(&out, []byte(in), "", "\t") if err != nil { return in } return out.String() }