一、基本概念
golang中struct是一种复合数据结构,它可以包含零个或多个任意类型的字段。如果我们在定义struct的同时初始化它,我们可以使用字段名称来显式初始化每个字段。
package main import "fmt" type person struct { name string age int } func main() { p1 := person{"Alice", 20} fmt.Println(p1) }
以上代码定义了一个person结构体,并使用字段名称初始化了它的两个字段name和age。然后我们创建了一个p1的变量,并将这个person结构体实例化赋值给它。最后使用fmt.Println来打印这个person实例。
二、匿名结构体初始化
匿名结构体没有类型名称,我们可以在创建struct变量时直接初始化它。这在一些临时场景下非常有用,比如我们需要把一些数据打包成一个结构体传递给函数参数。
package main import "fmt" func main() { p1 := struct { name string age int }{ name: "Alice", age: 20, } fmt.Println(p1) }
上面的例子中,我们创建了一个匿名结构体,初始化name和age字段,并将实例化赋值给p1变量。
三、指针struct初始化
如果我们初始化一个指向struct的指针变量,可以使用&符号进行操作。结构体指针变量在指向结构体实例前必须被初始化。结构体指针变量是使用* 语法定义的。
package main import "fmt" type person struct { name string age int } func main() { p1 := &person{ name: "Alice", age: 20, } fmt.Println(p1) }
这个例子中,我们定义了一个person结构体,通过&和结构体字面量初始化一个person指针变量p1,并使用name和age字段进行初始化。
四、继承初始化
在golang中,可以通过嵌入其他结构体来实现继承,使用起来非常方便。当我们使用嵌入式结构来定义一个新的struct时,被嵌入的结构体的字段会成为新的结构体的一部分,访问时我们可以通过嵌套结构体字段的名称来访问。
package main import "fmt" type person struct { name string age int } type employee struct { person id int } func main() { e1 := employee{ person: person{"Alice", 20}, id: 1, } fmt.Println(e1) }
在上面的例子中,我们定义了一个person结构体和employee结构体,在employee结构体中嵌入了person结构体。我们使用person结构体实例初始化employee结构体实例,同时初始化了id字段。最后使用fmt.Println打印employee实例时,它包含嵌套的person实例。
五、结构体零值初始化
在golang中,当我们定义一个struct时,默认情况下它的所有字段都被初始化为零值。对于数值类型,默认值为0,布尔类型默认值为false,字符串类型默认值为"",指针类型默认值为nil。
package main import "fmt" type person struct { name string age int } func main() { var p1 person fmt.Println(p1) }
这个例子中,我们定义了一个person结构体,并使用var关键字初始化一个空的person实例p1。由于person结构体中的字段都是空的,所以运行这个程序时我们会看到{name:"", age:0}被打印出来。