文章《A Tour of Go》是官方文档,地址是https://tour.golang.org/welcome/1。
该文档在官方《Go Documentation》系列文档中的位置如图所示。
以下是我的学习笔记的第二部分。
More types: structs, slices, and maps
- Go有指针,零值是
nil
,有&
和*
操作符,但没有指针算术 -
struct
是一些字段/属性(field
集合,语法以type
开头:type Vertex struct
-
struct
的field
用点号(.
)访问 - 通过指针访问也只需使用点号(
.
),不用加星号(*
),p.X
即可 -
struct
的属性可以用Name:
语法初始化,顺序无关紧要,不关心的属性也可以缺省 - 数组的长度是数组结构的一部分,因此数组不能被
resize
;数组可以直接输出; - 切片
slice
是动态大小的,可以从数组创建(前闭后开区间) -
slice
不存储数据,只是指向了底层数据的某个区间,因此一个切片更改后,真实数据会被更改,其他指向同一数组区间的slice
就可能看到改动 - 字面常量切片先构建一个数组,然后指向它构建切片(可能需要去看内存模型The Go Memory Model);现场定义的
struct
切片初始化 -
slice
的起始和结束位置都是可以省略的,默认值是数据的开始位置(0)和结束位置(length) -
slice
有长度(length
)和容量(capacity
),length
是切片拥有的元素个数,capacity
是从切片开始位置到数据结束位置的元素个数,可以分别用len(s)
和cap(s)
获得 -
slice
的零值是nil
,nil slice
长度为0,容量为0,没有实质分配内存 -
slice
可以用make
创建,可以指定length
和capacity
-
slice
可以指向任何类型,包括slice
-
append
添加元素,如果超长了,会重新分配内存,并指向新的地址(略坑😱啊),详细参考Go Slices: usage and internals -
range
返回位置和元素的副本(copy
),用在for
循环里遍历slice
或者map
- 使用下划线扔掉不关心的变量,比如循环中
range
返回的index
或者value
- 关于
slice
的一个小练习
生成的图像如下:
-
map
的零值是nil
,一个nil
的map没有key
,也不能添加;可以用make
函数构造一个map
,它会被初始化并可用 -
map literals
(官方翻译是map文法)跟struct
类似,不过需要有键值 - 顶级类型只有类型名时,可以省略
未完待续。