数组和切片
一.数组
Go语言的数组也是一个元素类型相同的定长的序列
1.创建
A.创建方式1:
var iarray1 [5]int // 声明数组,自动赋值所有成员为0 iarray1 = [5]int32{1, 2, 3, 4, 5} var iarray2 [5]int = [5]int32{1, 2, 3, 4, 5} //声明并初始化
B.创建方式2:
iarray3 := [5]int{1, 2, 3, 4, 5}
C.创建方式3:
iarray5 := [...]int{11, 12, 13, 14, 15}
2.数组的长度和容量
len(array)和cap(array)求值,两者一致.
3.遍历数组
for k, v := range iarray { fmt.Println(k, v) }
二.切片
切片是长度可变、容量固定的相同的元素序列
1.创建
A.方式1: make ( []Type ,length, capacity ) B.方式2: make ( []Type, length) C.方式3: []Type{} D.方式4: []Type{value1 , value2 , ... , valueN }
除了make外,创建切片和数组唯一的区别是,Type 前的“ [] ”中是否有数字,为空,则代表切片,否则则代表数组.
2.一个切片是一个隐藏数组的引用
arr1 := []int{1, 3, 3, 3, 3} arr2 := arr1 arr2[0] = 1000 fmt.Println(arr1, arr2)
// arr2更改值后,arr1也被更改了;数组则不会有此特性
3.遍历/修改切片
func main() { arr1 := []int{1, 3, 3, 3, 3} arr1[0] = 1000 for k, v := range arr1 { fmt.Println(k, v) } }
4.追加/复制切片
append:
func main() { arr1 := []int{1, 3, 3, 3, 3} arr2 := append(arr1, 15, 20) for k, v := range arr2 { fmt.Println(k, v) } }
copy:
func main() { arr1 := []int{1, 3, 3, 3, 3} arr2 := make([]int, 2) copy(arr2, arr1) // 将arr1复制到arr2中,两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制 arr2[0] = 500 fmt.Println(arr1, arr2) }
三.数组和切片作为函数参数
1.数组作为参数
func Handle(arr [2]int) { arr[0] = 100 } func main() { arr1 := [2]int{1, 52} Handle(arr1) fmt.Println(arr1) }
// 参数传递是对数组的复制,Handle改变的是arr1的一个副本,不会对arr1有影响
2.切片做参数
func Handle(arr []int) { arr[0] = 100 } func main() { arr1 := []int{1, 52} Handle(arr1) fmt.Println(arr1) }
切片是一个引用,Handle改变了arr1的元素.
Go语言的函数调用参数全部是传值的, 包括 slice/map/chan/inerface 在内所有类型.slice/map/chan/interface传递了引用.