我有下面的结构,它包含通道和用于存储数据的映射。我希望能够将该结构传递到函数中,以便利用这些通道,这样一旦它们被触发/有传入消息,就可以使用它们来更新与之相关的映射。
我知道映射在发送到各种函数时默认是通过引用传递的。即使它们包含在自定义结构中,情况也会一样吗?如何确保我的整个结构通过引用传递给函数,以便更新存储并利用其通道?
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
}
切片、映射和通道是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
在您尝试按值传递它时发出抱怨。