
package main import ( "fmt" syncmap "golang.org/x/sync/syncmap" ) type Mark struct{ Values syncmap.Map } var chanA chan int = make(chan int , 1) func (m Mark)funa(){ go func(){ m.Values.Store("a",1) chanA<-1 }() <-chanA } func main() { var mk = new (Mark) mk.Values.Store("a",0) mk.funa() va, p := mk.Values.Load("a") fmt.Printf("%v:%v\n",va,p) } 没有这行 mk.Values.Store("a",0) 永远取不到值 va 等于 nil p 等于 false
1 zhouyin OP 需要把函数 funa 定义成指针接收者 就不需要初始化 ```golang func (m *Mark)funa(){ go func(){ m.Values.Store("a",1) chanA<-1 }() <-chanA } ``` 道理上想不通 值接收者如果设计到变量拷贝 那么在函数里赋值也没用 |
2 buffzty 2 天前 加个*号 |
3 iseki 2 天前 via Android > A Map must not be copied after first use. |
4 SGL 2 天前 原文档内容:The zero Map is empty and ready for use. A Map must not be copied after first use. Map 的定义如下: ``` type Map struct { _ noCopy // 这个在源码中设置 m isync.HashTrieMap[any, any] } ``` noCopy 类型的说明: noCopy may be added to structs which must not be copied after the first use. See https://golang.org/issues/8005#issuecomment-190753527 for details. Note that it must not be embedded, due to the Lock and Unlock methods. 如果你想问,进一步为什么 Map 是“noCopy"的,需要进一步研究 HashTrieMap 的结构: ```go type HashTrieMap[K comparable, V any] struct { inited atomic.Uint32 initMu Mutex root atomic.Pointer[indirect[K, V]] keyHash hashFunc valEqual equalFunc seed uintptr } ``` 可以看到里面封装了 Mutex ,先不管其他变量,至少 Mutex 是肯定不可拷贝的, 内部维护锁的状态( locked/unlocked )以及等待队列这些资源。 |
5 Ketteiron 1 天前 值接收者会强制复制值,这应该知道吧。 简单来说,sync.Map, sync.Mutex 不能被复制,在你这个用例中,读和写是不同的 map 实例。 |