交互式爱情
*Groups而是返回一个指针。嵌入互斥指针也可以,但有两个缺点,需要您格外小心:结构的零值将有一个 nil 互斥体,因此您必须每次显式初始化它func main() { a, _ := NewGroups() a.Lock() // panic: nil pointer dereference}func NewGroups(names ...string) (Groups, error) { return Groups{/* whoops, mutex zero val is nil */ Names: names}, nil}分配一个结构值,或将其作为函数 arg 传递,会创建一个副本,因此您还可以复制互斥指针,然后锁定所有副本。(在某些特定情况下,这可能是一个合法的用例,但大多数时候它可能不是您想要的。)func main() { a, _ := NewGroups() a.Lock() lockShared(a) fmt.Println("done")}func NewGroups(names ...string) (Groups, error) { return Groups{Mutex: &sync.Mutex{}, Names: names}, nil}func lockShared(g Groups) { g.Lock() // whoops, deadlock! the mutex pointer is the same}保留原始结构并返回指针。您不必显式地初始化嵌入式互斥锁,而且很直观,互斥锁不与您的结构副本共享。func NewGroups(names ...string) (*Groups, error) { // ... return &Groups{}, nil}游乐场(有失败的例子):https : //play.golang.org/p/CcdZYcrN4lm