数组 :
定长且元素类型一致,在索引逻辑上连续存储,数组的内存地址是存储的第一个元素的内存地址
几种创建方式:
仅声明
var nums [ 3 ] int
声明并赋值
var nums = [ 2 ] string {"武沛齐","alex"}
声明并按下标赋值
var nums = [ 3 ] int {0:88,2:1 }
省略长度,自动补充长度
var nums = [ ... ] string{"武沛齐","alex"}
特殊的数组:字符串类型数组
1)字符串数组本身并不保存字符串值
2) 数组中存储的是指针和长度,用于存储字符串的实际地址和字节长度.
并且指针和长度的内存大小都为8个字节。
字符串类型数组的拷贝
地址发生改变
数组的循环for range关键字
切片:
可以看作动态数组,创建 不用指定长度的 可指定容量的 可变数组。
在go1.14版本中当存储元素个数超过当前容量时,容量自动扩容为2倍。(容量>1024时,每次扩容增加1/4)
创建切片:
var nums [ ] int
data := [ ] int{ }
users := make ([ ] int ,2 ,5)
make关键字仅用于切片,字典,channel
切片扩容机制:
v1 := make([ ] int ,1,3)
v2 := append( v1 , 66)
不触发扩容时,v1 v2为同一个内存地址
扩容后,v1 v2引用不同的内存地址
切片的扩容问题:
切片的拼接方法:
v1 := []int{11,22,33} v2 :=append(v1,44) //创建新内存地址 追加44 v3 := v1[1:3] //从1到2 v4 := v1[2:] //从2到结尾 v5 := v1[:3] //从开头到2
v1 := []int {11,22,33,44,55,66} result := append(v1[:2],v1[3:]...)