Go 函数按值返回锁

Go 函数按值返回锁,go,Go,我有以下结构 type Groups struct { sync.Mutex Names []strng } 和以下功能 func NewGroups(names ...string) (Groups, error) { // ... return groups, nil } 当我使用go vet检查语义错误时,我收到以下警告: NewGroups returns Lock by value: Groups 当go vet大喊大叫时,这并不好,这一代码会带来

我有以下结构

type Groups struct {
    sync.Mutex
    Names []strng
}
和以下功能

func NewGroups(names ...string) (Groups, error) {
    // ...
    return groups, nil
}
当我使用
go vet
检查语义错误时,我收到以下警告:

NewGroups returns Lock by value: Groups
go vet
大喊大叫时,这并不好,这一代码会带来什么问题?
如何修复此问题?

您需要将sync.Mutex嵌入为指针:

type Groups struct {
    *sync.Mutex
    Names []strng
}
回答您对问题的评论:在文章中,注意Gerrand没有从函数返回结构,而是立即使用它,这就是他不使用指针的原因。在您的例子中,您将返回它,因此您需要一个指针,以便不复制互斥体


更新:正如@JimB指出的,嵌入指向
sync.Mutex
的指针可能不是明智之举,最好返回指向外部结构的指针,并继续将
sync.Mutex
作为值嵌入。考虑你在特定的情况下所要完成的任务。< /P>替代一个互斥指针来代替(<代码> *同步。Mutex < /代码>)。是的,但是如果你看Andrew Gerrand的例子:他没有被指针嵌入。一个通常会返回一个<代码> *组<代码>,而不是嵌入一个PONTER。solution@JimB说得好。更新答案,包括警告/备选方案。