2017-08-11 258 views
2

从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! 

有人可以帮忙解释一下在这些情况下,实际上是怎么回事?

+2

前两个例子你有没有指针。最后三个都是一样的,知道这个类型在可以推断时可以从复合文字中消除。你在寻找[Composite Literal spec](https://golang.org/ref/spec#Composite_literals)吗? – JimB

+1

@JimB谢谢!材料正是我需要理解的。看来,GOPL书中没有涉及这个话题(或者我错过了实际上提及它的章节......) –

回答

0

请详细说明您的结构定义。

但是,如果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}} 

我希望帮你