如何确保由通道和贴图组成的结构通过引用传递



我有下面的结构,它包含通道和用于存储数据的映射。我希望能够将该结构传递到函数中,以便利用这些通道,这样一旦它们被触发/有传入消息,就可以使用它们来更新与之相关的映射。

我知道映射在发送到各种函数时默认是通过引用传递的。即使它们包含在自定义结构中,情况也会一样吗?如何确保我的整个结构通过引用传递给函数,以便更新存储并利用其通道?

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在您尝试按值传递它时发出抱怨。

最新更新