目录
数组
- 数组是值传递,每次传递到方法会复制一份相同的副本
- 声明数组方式如下
var array_number [10]int //声明
array_number = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //赋值
array_number := [5]int{1, 2, 3, 4, 5} // ---> 快速初始化
- 定义数组时如果长度不确定可以使用 ... 代替,编译器会根据元素个数自行推断数组的长度:
array_number := [...]int{1, 2, 3, 4, 5}
访问数组
通过坐标索引访问数组,第一个元素从0开始,不支持负数下标
func main() {
array_number := [...]int{1, 2, 3, 4, 5}
fmt.Println(array_number[0]) //---> 1
}
遍历数组
array_number := [...]int{1, 2, 3, 4, 5}
for i, number := range array_number {
fmt.Printf("index %d is %d ", i, number)
}
以上代码输出结果:
0 is 1 1 is 2 2 is 3 3 is 4 4 is 5
切片
切片是长度可变的数组,是数组的抽象,内部包括3个对象
- Data 指向底层实际的数组的指针
- Capacity 容器,也就是最大长度
- Length 长度
声明切片有3种方式
1 . 使用数组的索引坐标方式
array_number := [...]int{1, 2, 3, 4, 5}
slice_number := array_number[1:2]
fmt.Println(slice_number)
- 可以省略开始坐标和结束坐标其中一个,或都省略
-
开始坐标缺省默认0,结束坐标缺省默认最后一个坐标
slice_number := array_number[:]
//从头到尾
2 . 使用字面量
slice_number2 := []int{1, 25, 25}
- 以上代码表示初始化int类型的切片,底层数组指向{1,25,25},cap=len=3
slice_number3 := make([]int, 3)
slice_number3 := make([]int, 3, 10)
- make方式创建时提供3个参数
- 第一个参数数组的type
- 第二个切片的长度len
- 第三个时切片的容量,最大长度capacity(非必要)
- 容量如果大于len时编译会出错
./main.go:10:23: len larger than cap in make([]int)
- 切片可以通过len(),cap()方法查看长度和容量
fmt.Printf("len=%d cap=%d slice=%v\n", len(slice_number3), cap(slice_number3), slice_number3)
切片追加-Append
切片可以使用append()方法在原有的数组尾部追加元素:
slice_number3 := make([]int, 3, 4)
slice_number3 = append(slice_number3, 2)
追加后长度大于原有容量时会自动进行扩容
- 容量小于1024时自动扩容为原有容量的2倍
- 容量大于1024时则每次增加25%,直到满足需求为止
slice_number3 := make([]int, 3, 6)
slice_number3 = append(slice_number3, 2, 4, 6, 5)
fmt.Printf("len=%d cap=%d slice=%v\n", len(slice_number3), cap(slice_number3), slice_number3)
输出结果:
len=7 cap=12 slice=[0 0 0 2 4 6 5]
切片复制-Copy
使用copy()方法复制切片
slice_number := []int{1}
slice_number2 := make([]int, 1, 6)
copy(slice_number2, slice_number)
如果复制前切片的长度大于复制后切片的长度,会自动截取
slice_number := []int{1,2}
slice_number2 := make([]int, 1, 6)
copy(slice_number2, slice_number) //只会复制第一个元素
fmt.Println(slice_number2) // --打印[1]