type fun struct {}
type starcraft struct {
*fun // embedding struct
mu sync.Mutex
}
我知道我可以将初始struct startcraft视为:
f := &fun{}
s := starcraft{f, *new(sync.Mutex)}
我不喜欢它,因为:
一个。我不想自己初始化sync.Mutex
湾在这种情况下,使用* new(sync.Mutex)存在浪费的副本。
还有更好的方法吗?
答案 0 :(得分:4)
您可以命名嵌入式结构:
s := starcraft{
fun: f,
mu: *new(sync.Mutex),
}
您不需要使用new
来创建零值。如果已经声明了类型,则根本不需要初始化它,或者您可以使用零值。
s := starcraft{
fun: f,
mu: sync.Mutex{},
}
由于互斥锁的零值是有效的,未锁定的互斥锁(http://golang.org/pkg/sync/#Mutex),因此您绝对不需要初始化它,并且可以将其从结构文字中删除。
s := starcraft{
fun: f,
}
除此之外,嵌入互斥锁并直接在外部结构上调用Lock
和Unlock
也很常见。
答案 1 :(得分:2)