提问人:AC007 提问时间:2/7/2022 最后编辑:AC007 更新时间:2/8/2022 访问量:352
如何确保由通道和映射组成的 Struct 通过引用传递?
How to ensure that a Struct that is made up of channels and map gets passed by reference?
问:
我有以下结构,其中包含用于存储数据的通道和映射。我希望能够将该结构传递到函数中,以便利用这些通道,以便在它们被触发/收到消息后,使用它们来更新与之关联的映射。
我知道默认情况下,地图在发送到各种函数时会通过引用传递。即使它们包含在自定义结构中,情况也会相同吗?如何确保我的整个结构通过引用传递给函数,以便更新存储并利用其通道?
type CustomStrct struct {
Storage map[string]string
RetrieveChannel chan string
InsertChannel chan string
}
这是我创建的一个构造函数,用于初始化结构的新实例:
func InitializeNewStore() CustomStrct {
newCustomStruct := CustomStrct {
Storage: make(map[string]string),
RetrieveChannel: make(chan Request),
InsertChannel: make(chan Request),
}
return newCustomStruct
}
答:
2赞
jch
2/7/2022
#1
切片、映射和通道是 Go 中类似指针的值:复制包含通道的结构会复制对通道的引用,而不是通道本身:
a := CustomStrct{
RetrieveChannel: make(chan Request),
}
b := a
log.Println(a.RetrieveChannel == b.RetrieveChannel) // logs true
因此,通过值或引用传递结构是非常好的。
如果你需要确保将标记尝试按值传递你的结构,最简单的解决方案是在结构中嵌入一个:go vet
sync.Mutex
type CustomStrct struct {
mu sync.Mutex
...
}
您不需要实际使用互斥锁:只需将其嵌入到结构中,每当您尝试按值传递它时,都会引起抱怨。go vet
上一个:从函数向全局结构赋值
下一个:const C 中的结构参数
评论
struct
func AddToMap(cs CustomStruct){ cs.Storage["foo"]="foo" }