Go从入门到精通——结构体(struct)——初始化结构体的成员变量
初始化结构体的成员变量
结构体在实例化时可以直接对成员变量进行初始化。
初始化有两种形态:
1、字段 "键值对" 形式及多个值的列表形式。(键值对形式的初始化适合选择性填充字段较多的结构体)
2、多个值的列表形式适合填充字段较少的结构体。
一、使用“键值对”初始化结构体
结构体可以使用“键值对”(key value pair)初始化字段,每个 "键"(key)对应结构体中的一个字段。键的“值”(value)对应字段需要初始化的值。
键值对的填充是可选的,不需要初始化的字段可以不填入初始化列表中。
结构体实例化后字段的默认值是字段类型的默认值,也就是零值。例如:数值为0,字符串Wie空字符串,布尔为 false,指正为 nil 等。
1、键值对初始化结构体的书写格式
键值对初始化的格式如下:
ins := 结构体类型名{
字段1: 字段1的值,
字段2: 字段2的值,
...
}
2、使用键值对填充结构体的例子
下面例子中描述了家里的人物关联。正如儿歌里唱的:“爸爸的爸爸是爷爷”,人物之间可以使用多级的 child 来描述和建立关联。使用键值对形式填充结构体的代码如下:
package main
type People struct {
name string
child *People
}
relation := &Peolple{
name: "爷爷",
child: &People{
name: "爸爸",
child: &Peole{
name: "我",
},
},
}
二、使用多个值的列表初始化结构体
Go 语言可以在 "键值对" 初始化的基础上忽略 "键"。也就是,可以使用多个值的列表初始化结构体的字段。
1、多个值列表初始化结构体的书写格式
多个值使用逗号分隔初始化结构体,例如:
ins := 结构体类型名{
字段 1 的值,
字段 2 的值,
...
}
使用这种格式是初始化时,需要注意:
- 必须初始化结构体的所有字段。
- 每一个初始值的填充顺序必须与字段在结构体中声明顺序一致。
- 键值对与值列表的初始化形式不能混用。
2、多个值列表初始化结构体的例子
package main
type Address struct{
Province string
City string
ZipCode int
PhoneNumber string
}
add := Address{
"四川",
"成都",
610000,
"0",
}
三、初始化匿名结构体
匿名结构体没有类型名称,无须通过 type 关键字就可以直接使用。
1、匿名结构体定义格式和初始化写法
匿名结构体的初始化写法由结构体定义和键值对初始化两部分组成。结构体定义时没有结构体类型名,只有字段和类型定义。键值对初始化部分由可选的多个键值对组成,如下格式所示:
ins := struct{
//匿名结构体字段定义
字段 1 字段类型1
字段2 字段类型2
...
}{
//字段值初始化
初始化字段 1: 字段 1 的值,
初始化字段 2: 字段 2 的值,
...
}
- 字段1、字段2……:及饿哦固体定义的字段名。
- 初始化字段1、初始化字段2……: 结构体初始化时的字段名,可选择性地对字段初始化。
- 字段类型1、字段类型2……: 结构体定义字段的类型。
- 字段1的值,字段2的值……:结构体初始化字段的初始值。
键值对初始化部分是可选的,不初始化成员时,匿名结构体的格式变为:
ins := struct{
字段 1 字段类型 1
字段 2 字段类型 2
...
}{}
2、使用匿名结构体的例子
package main
import "fmt"
//定义 printMsgType()函数,参数为 msg,类型为 *struct{id int data string}。
//因为没有使用type定义,所以需要在用到的地方每次进行定义。
func printMsgType(msg *struct {
id int
data string
}){
//使用动词 %T 打印 msg 的类型
fmt.Printf("%T\n", msg)
}
func main(){
//实例化一个匿名结构体。对匿名结构体进行实例化,同时初始化成员
msg := &struct{
id int
data string
}{
1024,
"hello"
}
printMsgType(msg)
}
匿名结构体在使用时需要重新定义,造成大量的重复的代码,因此开发中较少使用。