go语言的array、slice 和 map
数组作为语言中必不可少的一个存在,自然要关注,而slice(切片)是go语言对数组的抽象。
array
在go中,我们这样声明一个数组:
var arr [10]int
赋值:
arr[0]=1
数组大小是类型的一部分。由于不同的大小是不同的类型,因此不能改变大小
数组同样是值类型的: 将一个数组赋值给另一个数组,会复制所有的元素。尤其是当向函数内传递一个数组的时候,它会获得一个数组的副本,而不是数组的指针。
当然,作为语法超赞的go,当然还有更简洁的数组声明,和赋值语句,比如:
a :=[2]int{1,2}
不确定数组长度的情况下可以:
a :=[...]int{1,2}
, go会自动计数。(注意三点...是不能省略的)。
slice
slice 与 array 接近,但是在新的元素加入的时候可以增加长度。
slice 总是指向底层的
一个 array。
slice 是一个指向 array 的指针,这是其与 array 不同的地方;slice 是引用
类型,这意味着当赋值某个 slice 到另外一个变量,两个引用会指向同一个 array。
slice声明语法:
var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)
实例展示:
// array[n:m] 从 array 创建了一个 slice,具有元素 n 到 m-1
a := [...]i n t {1, 2, 3, 4, 5} .0
s1 := a[2:4] .1
s2 := a[1:5] .2
s3 := a[:] .3
s4 := a[:4] .4
s5 := s2[:] .5
.0 定义一个 5 个元素的 array,序号从 0 到 4;
.1 从序号 2 至 3 创建 slice,它包含元素 3, 4;
.2 从序号 1 至 4 创建,它包含元素 2, 3, 4, 5;
.3 用 array 中的所有元素创建 slice,这是 a[0:len(a)] 的简化写法;
.4 从序号 0 至 3 创建,这是 a[0:4] 的简化写法,得到 1, 2, 3, 4;
.5 从 slice s2 创建 slice,注意 s5 仍然指向 array a。
map
在 Go 中有 map 类型。map 可以认为是一个用字符串做索引的数
组(在其最简单的形式下).
Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
- map定义方法:
map [<from type>]<to type>
比如,time:= map[string]int{
"year":2019,
"month":12,
"day":2,
}
也可以用,make(参照内建函数)的形式:
time := make(map[string]int)
- 打印年份:
fmt.Printf("%d", time["year"])
-
map新增元素:
time["hour"] = 22 -
map重写元素:
time["hour"] = 23 -
检查这个元素是否存在:
value, present = monthdays["Jan"] 如果存在,present 则有值 true
或者
v, ok := monthdays["Jan"]
array、slice、map这三者,常常与range, copy, append等内建函数联合使用(多记)。