Одна и та же 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 — проверить