go语言学习笔记 — 基础 — 高级数据类型 — 结构体:初始化结构体的成员变量
Posted Locutus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 基础 — 高级数据类型 — 结构体:初始化结构体的成员变量相关的知识,希望对你有一定的参考价值。
在实例化结构体时,我们可以直接初始化结构体成员变量。有两种形式:
- 字段键值对及字段值的多个列表形式,适合选择性填充字段较多的结构体
- 多个值列表的形式,适合填充字段较少的结构体
1. 使用“键值对”初始化结构体成员变量(键值对)
键值对的填充是可选的,不需要初始化的成员变量字段可以不填入初始化列表{}中。
结构体实例化后字段默认值是对应类型零值,如int为0,bool为false,string为空字符串,指针为nil。
- 格式
变量ins := 结构体类型名{
字段1: 字段1的值,
字段2: 字段2的值,
...
}
注意:键值之间以:分隔;键值对之间以,分隔。结构体成员变量字段不能重名。
- 使用“键值对”填充结构体
家庭人物关系,人物之间关系可以使用多重child描述。
// 定义结构体People(或者叫People类型)
type People struct{
name string
child *People // 成员变量字段child,值是结构体指针类型*People
}
// 取People类型的内存地址,形成结构体实例relation,为*People结构体指针类型
relation := &People{
name : "爷爷",
child : &People{ // 使用&取地址实例化一个People,{}初始化成员变量
name : "爸爸",
child: &People{
name: "我",
}
}
}
结构体成员变量,只能包含同一结构体的指针类型。如果还有非指针的同类型,会报编译错误。
2. 使用多个值的列表初始化结构体(值列表)
在键值对初始化基础上,忽略“键”,我们可以使用多个值列表形式初始化结构体。
- 格式
变量ins := 结构体类型名{
字段1的值,
字段2的值,
...
}
注意:必须初始化结构体所有字段。
不能混用键值对和值列表的结构体初始化方式。
每一个初始值填充顺序与成员变量字段在结构体声明顺序一致。
- 多个值列表的形式初始化结构体
描述一段地址结构,具有一定的顺序。
type Address struct {
Province string
City string
ZipCode int
PhoneNumber string
}
addr := Address{
"四川",
"成都",
610000,
"0",
}
fmt.Println(addr)
// {四川 成都 610000 0}
3. 定义匿名结构体,并初始化成员变量字段(少用)
匿名结构体没有类型名称,无须通过关键字type定义,直接使用。由匿名结构体定义和键值对初始化成员变量两部分组成。
- 格式
ins := struct{
字段1 字段类型1
字段2 字段类型2
字段3 字段类型3
...
}{
// 键值对初始化结构体成员变量,可选择性对字段初始化
字段1: 字段1的值,
字段2: 字段2的值,
...
}
键值初始化部分是可选的,不初始化成员变量字段时,匿名结构体格式为
ins := struct {
字段1 字段类型1
字段2 字段类型2
...
}{}
- 例子
package main
import (
"fmt"
)
// 打印消息类型,入参为匿名结构体
func printMsgType(msg *struct {
id int // 定义匿名结构体
data string
}) { // 函数体
fmt.Printf("%T\\n", msg) // 使用动词%T,打印msg的类型
fmt.Println(msg)
}
func main() {
msg := &struct { // 使用&取地址实例化,得*struct指针类型变量
id int
data string
}{
1024, // 值列表初始化成员变量
"hello",
}
printMsgType(msg) // 把msg变量传入printMsgType函数
}
// *struct { id int; data string }
// &{1024 hello}
匿名结构体的类型名,是结构体包含成员变量字段的详细描述。每次使用匿名结构体都要定义,造成重复代码,尽量少用。
以上是关于go语言学习笔记 — 基础 — 高级数据类型 — 结构体:初始化结构体的成员变量的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组:一维数组
go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 切片:切片内部结构
go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组:向函数传递数组
go语言学习笔记 — 基础 — 高级数据类型 — 派生类型:指针(pointer)数据容器函数(func)结构体(struct)通道(channel)