-1

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

我了解默认情况下,地图在发送到各种功能时是通过引用传递的。即使它们包含在自定义结构中,情况也会相同吗?我如何确保我的整个结构通过引用传递给函数以更新存储并利用其通道?

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 
}
4

1 回答 1

2

切片、映射和通道在 Go 中是类似指针的值:复制包含通道的结构会复制对通道的引用,而不是通道本身:

a := CustomStrct{
    RetrieveChannel: make(chan Request),
}
b := a
log.Println(a.RetrieveChannel == b.RetrieveChannel)    // logs true

所以通过值或引用传递你的结构是很好的。

如果您需要确保go vet将标记尝试按值传递您的结构,最简单的解决方案是将 a 嵌入sync.Mutex到结构中:

type CustomStrct struct {
    mu sync.Mutex
    ...
}

您不需要实际使用互斥锁:只要将它嵌入到结构中就会go vet在您尝试按值传递它时引起抱怨。

于 2022-02-06T20:31:41.573 回答