Одна и та же map в канале: агрегация партий
ЗадачаMiddle15 минпроверка — Спринтчто выведет и почему08-t015
Скажите, что выведет программа и почему (первые выводимые строки получаются одинаковыми). Исправьте код, чтобы это было корректно.
main.gogo
1package main2 3import (4 "fmt"5 "sync"6 "time"7)8 9func StartFeed() <-chan map[string]int {10 var feed = make(chan map[string]int)11 12 go func() {13 var snapshot = map[string]int{14 "M1": 210,15 "M2": 140,16 "M3": 95,17 "M4": 300,18 }19 20 for i := 1; i < 6; i++ {21 for key, value := range snapshot {22 snapshot[key] = int(float64(value) * 1.2)23 }24 25 feed <- snapshot26 time.Sleep(80 * time.Millisecond)27 }28 close(feed)29 }()30 31 return feed32}33 34func StartWorker(wg *sync.WaitGroup, batches []map[string]int, mu *sync.Mutex) {35 go func() {36 defer wg.Done()37 38 for _, batch := range batches {39 mu.Lock()40 for key, value := range batch {41 batch[key] = value + 142 }43 fmt.Println(batch)44 mu.Unlock()45 }46 }()47}48 49func main() {50 f := StartFeed()51 52 var batches []map[string]int53 54 for {55 value, ok := <-f56 if !ok {57 break58 }59 batches = append(batches, value)60 }61 62 for _, batch := range batches {63 fmt.Println(batch)64 }65 66 wg := &sync.WaitGroup{}67 mu := &sync.Mutex{}68 69 for i := 0; i < 8; i++ {70 wg.Add(1)71 StartWorker(wg, batches, mu)72 }73 74 wg.Wait()75}⌘ Enter — проверить