Go语言精进之路读书笔记第12条——使用复合字面值作为初值构造器
有些时候,零值并非最好的选择,我们有必要为变量赋予适当的初值以保证其后续以正确的状态参与业务流程计算,尤其是Go语言中的一些复合类型的变量。Go提供了复合字面值(composite literal)语法可以作为复合类型变量的初值构造器。
Go语言中的复合类型包括结构体、数组/切片和map。
Go提供的复合字面值(composite literal)语法可以作为复合类型变量的初值构造器。复合字面值由两部分组成:一部分是类型,另一部分是由大括号{}包裹的字面值。
12.1 结构体复合字面值
推荐使用field:value的复合字面值形式对struct类型变量进行值构造。
特点
- 赋值顺序任意
- 新增字段无影响
- 其他未赋值字段采用零值
- 注意:未导出的字段无法赋值
即便采用类型零值时我们也会使用字面值构造器形式:s := Person{}
,而较少使用new这一个Go预定义的函数来创建结构体变量实例:s := new(Person)
s := Person{"张三", 23} //结构体
a := [5]int{1, 2, 1, 1, 1} //数组
a1 := []int{1, 2, 3} //切片
m := map[int]string{1: "aa"} //map
fmt.Println(s, a, a1, m)
12.2 数组/切片复合字面值
使用 index:value 的复合字面值形式对数组/切片变量进行值构造。例如
ascii := [256]int{'a': 1, 2} //index为97和98赋值
persons := []Person{{}, 9: {}} //length为10
fmt.Println(ascii, persons)
当元素为复合类型时,可以省去元素复合字面量中的类型,例如Person
不同于结构体复合字面值较多采用field:value形式作为值构造器,数组/切片由于其固有的特性,采用index:value为其构造初值,主要应用在少数场合,比如为非连续(稀疏)元素构造初值(如ascii)、让编译器根据最大元素下标值推导数组的大小(如person)等。
12.3 map复合字面值
使用 key:value 的复合字面值形式对map类型变量进行值构造。
当key或value的类型为复合类型时,我们可以省去key或value中的复合字面量中的类型(Go 1.5版本以及之后),例如
type Person struct {
age int
}
person := map[Person]*Person{
{18}: &Person{19},
}
fmt.Println(person)
对于key或value为指针类型的情况,也可以省略“&T”(也就是&Person可省略)。注意是字面量的时候可以省略,如果指定了类型,则必须要也保留&。