type fun struct {}
type starcraft struct {
*fun // embedding struct
mu sync.Mutex
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以将初始结构 startcraft 字面化为:
f := &fun{}
s := starcraft{f, *new(sync.Mutex)}
Run Code Online (Sandbox Code Playgroud)
我不喜欢它,因为:
A。我不想自己初始化sync.Mutex
b. 在这种情况下,使用 *new(sync.Mutex) 会产生浪费的副本。
还有更好的办法吗?
您可以命名嵌入结构:
s := starcraft{
fun: f,
mu: *new(sync.Mutex),
}
Run Code Online (Sandbox Code Playgroud)
您不需要使用new来创建零值。如果类型已经声明,则根本不需要初始化它,或者可以使用零值。
s := starcraft{
fun: f,
mu: sync.Mutex{},
}
Run Code Online (Sandbox Code Playgroud)
由于互斥量的零值是有效的、未锁定的互斥量(http://golang.org/pkg/sync/#Mutex),因此您绝对不需要初始化它,并且可以将其排除在结构文字之外。
s := starcraft{
fun: f,
}
Run Code Online (Sandbox Code Playgroud)
最重要的是,嵌入互斥锁并直接在外部结构上调用Lockand也很常见。Unlock