成员变量初始化特点
-
结构体初始化时可以直接对成员变量进行初始化
形式:
-
键值对的形式(key value pair)
-
键值对形式的初始化适合选择性填充字段较多的结构体
-
多个值的列表形式适合填充字段较少的结构体
初始化结构体格式
使用"键值对"初始化结构体
使用多个值的列表初始化结构体
初始化匿名结构体
使用"键值对"初始化结构体
特点:
-
每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值
-
键值对的填充是可选的,不需要初始化的字段可以不填入初始化列表中
-
结构体实例化后字段的默认值是字段类型的默认值--->因为结构体可以是基本类型的复合类型
使用键值对初始化结构体的格式:
ins := 结构体类型名{
字段1: 字段1的值,
字段2: 字段2的值,
…
}
-
结构体类型:定义结构体时的类型名称。
-
字段1、字段2:结构体成员的字段名,结构体类型名的字段初始化列表中,字段名只能出现一次。
-
字段1的值、字段2的值:结构体成员字段的初始值。
键值之间以:
分隔,键值对之间以,
分隔
使用键值对填充结构体的实例:
需求:
-
写一个人物关系结构体
-
法德的法德是格瑞法德
-
法德的桑是自己
package main
?
import "fmt"
?
/*
写一个People结构体
两个成员:
1、name
2、指向自己
*/
type People struct {
Name string
Child *People
}
?
func main() {
//初始化结构体的成员
relation := &People{
Name: "外祖父",
Child: &People{
Name: "父亲",
Child: &People{
Name: "自己",
/*
因为需要初始化的结构体成员可以自定义,所以可以套娃
*/
},
},
}
fmt.Println(relation)
}
结构体成员中只能包含结构体的指针类型,包含非指针类型会引起编译错误
使用多个值的列表初始化结构体
特点:
-
在“键值对”初始化的基础上忽略“键”,使用多个值的列表初始化结构体的字段
使用多个值列表初始化结构体的格式:
ins := 结构体类型名{
字段1的值,
字段2的值,
…
}
-
必须初始化结构体的所有字段。
-
每一个初始值的填充顺序必须与字段在结构体中的声明顺序一致。
-
键值对与值列表的初始化形式不能混用。
使用多值列表初始化结构体的代码示例:
需求:
-
创建一个地址结构体
-
包含省份、城市、邮编等成员
-
使用多值列表对其进行初始化
package main
?
import "fmt"
?
/*
创建一个省份结构体
*/
type Address struct {
Province string
City string
Code int64
}
?
func main() {
address := Address{
"广西",
"柳州",
545001,
}
fmt.Println(address)
}
初始化匿名结构体
特点:
-
匿名结构体没有类型名称,无须通过 type 关键字定义就可以直接使用
匿名结构体格式:
ins := struct {
// 匿名结构体字段定义
字段1 字段类型1
字段2 字段类型2
…
}{
// 字段值初始化
初始化字段1: 字段1的值,
初始化字段2: 字段2的值,
…
}
-
字段1、字段2:结构体定义的字段名。
-
初始化字段1、初始化字段2:结构体初始化时的字段名,可选择性地对字段初始化。
-
初始化字段是可选的,不初始化的成员结构:
-
ins := struct {
字段1 字段类型1
字段2 字段类型2
…
}
-
-
字段类型1、字段类型2:结构体定义字段的类型。
-
字段1的值、字段2的值:结构体初始化字段的初始值。
使用匿名结构体的示例代码:
需求:
-
创建一个信息匿名结构体
-
打印结构体内容
package main
?
import "fmt"
?
/*
创建一个创建匿名结构体并且打印的函数
使用字符串格式化中的%T动词,将 msg 的类型名打印出来
*/
func printMes(mes *struct{ id int; data string }) {
fmt.Printf("%T\n", mes)
}
?
func main() {
//实例化匿名结构体
msg := &struct {
//定义成员部分
id int
data string
}{
//初始化值
1024,
"Hello",
}
?
//调用打印方法
printMes(msg)
}