初始化
- 数组
var arr1 [4]int //数组会初始化为int类型的零值
var arr2 = [4]int{1, 2} //使用指定的初始值完成初始化
var arr3= [4]string{"北京", "上海", "天津"} //使用指定的初始值完成初始化
arr4 := [3]int{1,2,3} //指定固定长度,不可修改
arr5 := [...]int{1,2,3} //根据初始值的个数自行推断数组的长度
arr6 := [...]int{1: 1, 3: 5} // [0 1 0 5] 使用指定索引值的方式来初始化数组
*注意
数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值,数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的
切片(slice):
切片是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装,支持自动扩容。
切片是一个引用类型,内部结构包含
地址
、长度(len)
和容量(cap)
定义:var name []T //name变量名;T代表元素类型
var a []string //声明一个字符串切片
var b = []int{} //声明一个整型切片并初始化
var c = []bool{false, true} //声明一个布尔切片并初始化
切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到切片。 切片表达式中的low
和high
表示一个索引范围(左包含,右不包含)
完整切片表达式:
a[min:hign:max] //容量=max-min
完整切片表达式需要满足的条件:0 <= low <= high <= max <= cap(a)
a := [6]int{1, 2, 3, 4, 5, 6}
t := a[2:4:6]
t2 := a[3:5]
t3 := a[:5]
fmt.Println(t, len(t), cap(t)) //[3 4] 2 4
fmt.Println(t2, len(t2), cap(t2)) //[4 5] 2 3 容量等于得到的切片的底层数组的容量
fmt.Println(t3, len(t3), cap(t3)) //[1 2 3 4 5] 5 6 容量=cap(a)-min
*注意
切片是引用类型,不支持==,只能跟nil比较
总结:
- 数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性
- 切片是动态数组
- 数组需要明确指定大小,切片不需要。数组是值传递,切片是地址传递