具有多个字段的嵌入结构的字面初始化

Hel*_*ang 1 go

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) 会产生浪费的副本。

还有更好的办法吗?

Jim*_*imB 5

您可以命名嵌入结构:

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