在初始化指针
问题描述:
从GOPL(7.6节)的第7章的片Golang匿名结构,我注意到这条线:在初始化指针
var tracks = []*Track{
{"Go", "Delilah", "From the Roots Up", 2012, length("3m38s")},
{"Go", "Moby", "Moby", 1992, length("3m37s")},
{"Go Ahead", "Alicia Keys", "As I Am", 2007, length("4m36s")},
{"Ready 2 Go", "Martin Solveig", "Smash", 2011, length("4m24s")},
}
我被它的初始化的Track
指针切片那种混淆。 所以后来我尝试下面的例子:
type Ex struct {
A, B int
}
a := []Ex{Ex{1, 2}, Ex{3, 4}}
b := []Ex{{1, 2}, {3, 4}}
c := []*Ex{&Ex{1, 2}, &Ex{3, 4}}
d := []*Ex{{1, 2}, {3, 4}}
e := []*Ex{{1, 2}, &Ex{3, 4}}
我发现所有的5例还好,没有错误。 {1, 2}
似乎是一个叫做“匿名结构”的结构,但它让我困惑,因为它工作正常,即使我试图填充指针*Ex
而不是Ex
结构。
此外,当我尝试下面的代码,它抱怨语法错误:
f := []*Ex{&{1, 2}, &{3, 4}} // Syntax Error!
有人可以帮忙解释一下在这些情况下,实际上是怎么回事?
答
请详细说明您的结构定义。
但是,如果EX是实现这一点:
type Ex struct {
t interface{}
o interface{}
}
你不给匿名结构的指针,因为定义它不知道。
你也可以这样做:
variable := new({1, 2})
// or
variable := {1, 2}
当你这样做:
b := []Ex{{1, 2}, {3, 4}}
// you create slice of Ex with two Ex struct
// so b := []Ex{Ex{t:1,o:2}, Ex{t:3, o:4}}
正相反:
f := []*Ex{&{1, 2}, &{3, 4}}
// you create slice of unknow definition type
// f = []Ex{Ex{t: addressOfUnknowType, o: addressOfUnknowType}}
我希望帮你
前两个例子你有没有指针。最后三个都是一样的,知道这个类型在可以推断时可以从复合文字中消除。你在寻找[Composite Literal spec](https://golang.org/ref/spec#Composite_literals)吗? – JimB
@JimB谢谢!材料正是我需要理解的。看来,GOPL书中没有涉及这个话题(或者我错过了实际上提及它的章节......) –