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

时间:2014-07-16 16:16:28

标签: go

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)存在浪费的副本。

还有更好的方法吗?

2 个答案:

答案 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,
}

除此之外,嵌入互斥锁并直接在外部结构上调用LockUnlock也很常见。

答案 1 :(得分:2)

可以命名嵌入式结构,这表明了这种方法

f := &fun{}
s := starcraft{fun:f}

这可能是你想要的

Playground