Потому что
map ссылочный тип и вы все время посылаете в канал ссылку на одну и ту же мапу. Нужно копировать
map и посылать новую копию. (Ну или использовать не
map а
struct)
for i := 0; i < 10; i++ {
// Create new map
val1 := make(map[string]interface{})
// Copy from the original map to the target map
for key, value := range val {
val1[key] = value
}
val1["v"] = i
c <- val1
}
Play
https://play.golang.org/p/eIxdPQfkzCi
Версия 0.1
Поскольку
map ссылочный тип передавать его через канал - мало смысла. Можно защитить и синхронизировать простым
sync.Mutex например так
package main
import (
"encoding/json"
"fmt"
"sync"
)
type Test1 map[string]interface{}
var R sync.Mutex
var W sync.Mutex
var val = Test1{
"s": 1,
"w": 2,
}
func main() {
R.Lock()
go run()
for i := 0; i < 10; i++ {
W.Lock()
val["v"] = i
R.Unlock()
}
}
func run() {
for {
R.Lock()
out, _ := json.Marshal(val)
fmt.Println(string(out))
W.Unlock()
}
}
Playground
https://play.golang.org/p/0uAOlhZuqjL