V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
zhouyin
V2EX  ›  Go 编程语言

golang.org/x/sync/syncmap 被 struct 裹挟时 使用前为什么必须为每个键初始化 不然取值得到 nil

  •  
  •   zhouyin · 10 小时 41 分钟前 · 365 次点击
    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

    3 条回复    2025-10-22 08:33:01 +08:00
    zhouyin
        1
    zhouyin  
    OP
       10 小时 29 分钟前
    需要把函数 funa 定义成指针接收者 就不需要初始化
    ```golang
    func (m *Mark)funa(){

    go func(){
    m.Values.Store("a",1)
    chanA<-1
    }()

    <-chanA
    }
    ```
    道理上想不通 值接收者如果设计到变量拷贝 那么在函数里赋值也没用
    buffzty
        2
    buffzty  
       9 小时 56 分钟前
    加个*号
    iseki
        3
    iseki  
       33 分钟前 via Android
    > A Map must not be copied after first use.
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   4744 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 01:06 · PVG 09:06 · LAX 18:06 · JFK 21:06
    ♥ Do have faith in what you're doing.