1. 数组
数组长度固定,因此在go语言中很少直接使用。slice的长度可以增长和缩短,在很多场合下使用的更多。但是在理解slice之前,我们必须先理解数组。
var a [3]int //包含3个整数的数组
fmt.Println(a[0]) //输出数组的第一个元素
fmt.Println(a[len(0) - 1]) //输出数组的最后一个元素
//输出索引和元素
for i, v := range a {
fmt.Printf("%d %d\n", i, v)
}
//仅仅输出元素
for _, v := range a {
fmt.Printf("%d\n", v)
}
也可以使用数组字面量根据一组值来初始化一个数组。
var q [3]int = [3]int{1 ,2 ,3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) //"0"
如下定义了一个拥有100个元素的数组r,除了最后一个元素值是-1,该数组中的其他元素值都是0。
r := [...]int{99:-1}
如果一个数组的元素类型是可比较的,那么这个数组也是可比较的。数组比较的结果是两个数组的元素的值是否完全相同。在golang中数组的size也属于数组的类型。
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) //"true false false"
d := [3]int{1, 2}
fmt.Println(a == d) //编译错误:无法比较[2]int == [3]int
2. slice
slice表示一个拥有相同类型元素的可变长度的序列。slice通常写成[]T
,其中元素的类型都是T
;slice看上去像是没有长度的数组。
数组和slice是紧密关联的。slice是一种轻量级的数据结构,可以用来访问数组的部分或者全部的元素,而这个数组称为slice的底层数组。slice有三个属性:指针、长度和容量。指针指向数组的第一个可以从slice中访问的元素,但是这个元素并不一定是数组的第一个元素。长度是指slice中有效元素的个数。容量是指slice中可容纳元素的个数。go的内置函数len
和cap
用来返回slice的长度和容量。
一个底层数组可以对应多个slice,这些slice可以引用数组的任何位置。彼此之间的元素还可以重叠。如下为slice的两种申明:
/*
1. 基于数组的声明
*/
//由于月份总是从1开始,因此省略索引0的声明
months := [...]string{1: "January", /* ... */, 12: "December"}
summer := months[6:9]
/*
2. 使用内置的make函数声明
*/
t1 := make([]T, len)
t2 := make([]T, len, cap) //和 make([]T, cap)[:len]功能相同
s :=[]int{0, 1} //此处的s是指向数组的slice
a :=[...]int{0, 1} //a是数组,请与s区别
使用数组指针作为参数重写reverse
函数。