您知道吗,在并发环境中将映射变量链接更改为另一个是否安全?一个例子是在一个 goroutine 中将 mapdata替换为新的 map,并在另一个 goroutine 中从它们中读取元素:import ( "fmt" "math/rand" "strconv" "testing" "time")func TestMap(t *testing.T) { s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1) data := fill(r1.Intn(100)) timer := time.NewTimer(10 * time.Second) go func() { s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1) for { select { case <-timer.C: return default: } p := r1.Intn(100) v := fill(p) data = v fmt.Println("_p=" + strconv.Itoa(p)) } }() for range []int{1, 2, 3, 4, 5, 6, 7, 8} { go func() { s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1) for { select { case <-timer.C: return default: } n := r1.Intn(100) s := strconv.Itoa(n) fmt.Println(data[s]) } }() } <-timer.C}func fill(postfix int) map[string][]string { m := make(map[string][]string) for i := 0; i < 100; i++ { s := strconv.Itoa(i) m[s] = []string{s + "_" + strconv.Itoa(postfix)} } return m}
- 2 回答
- 0 关注
- 116 浏览
添加回答
举报
0/150
提交
取消