go语言的数组与切片
数组
一.定义数组
1.如果用var定义,可以不设置初值,但必须给定长度
var arr1 [5] int
2.如果用 := 就一定要定义初值
arr2 := [4]int{1,2,3,4}
3.可以不定义数组长度,就必须在[]加… ,会根据初值给与长度。空的[]是切片 数组必须定义长度
arr3 := […]int {1,2,3,4,5,6}
二.遍历数组
1.普通遍历
for i:=0 ; i<len(arr2);i++{
fmt.Println(arr2[i])
}
2.使用range
for i,v :=range(arr2){ // i为index,v为值
fmt.Println(i,v)
}
三.数组是值传递
如果在printArray方法中对传进来的参数arr改变其值,在main方法中的arr1或arr3是不会改变的,这就是值传递。值传递是一个拷贝的过程
四.通过指针来实现引用传递的作用
func bbb(list *[4]int){ //接受一个[4]int的指针
for i,_ := range list{
list[i] = 0
}
}
func main(){
list := [4]int{1,2,3,4}
bbb(&list) //通过取地址符传递地址,所有指针变量的值都是地址
fmt.Println(list ) //[0 0 0 0]
}
如果这里不理解值传递和引用传递的区别,可以看我的另外一篇文章 Go语言的值传递
https://blog.csdn.net/weixin_42565137/article/details/91356974
数组总结:
如果在函数传递时传递数组,那就必须要传递一个数组长度相同的数组变量,这是十分不方便的。
所以,在大多数情况,我们会使用切片,而不是数组
切片
一.切片可以理解为数组的映射
s:=arr[2:] 映射arr数组索引为2到最后的这一范围(arr[:]代表整个范围,类似的还有arr[1:3]arr[3:])
func handleSlice(arr []int){
for i,_ := range arr{
arr[i] = 10
}
}
func main(){
arr := [5]int{1,2,3,4,5}
slice := arr[2:]
handleSlice(slice)
fmt.Println(arr) //[1,2,10,10,10]
}
但我们发现,这里我们没有用指针,但是为什么arr的值也改变了呢。因为之前说到go语言只支持值传递。我们可以认为这里是将arr索引为2到最后的这一范围的映射作为参数传递了,进行了一次拷贝,而这两个映射都是指向同一个数组,所以,printArray方法的切片改变了,main方法中的arr也进行了改变
二.定义切片
直接定义切片也会生成一个相同长度容量的数组作为映射
func printS(s []int){
fmt.Printf("len: %d cap: %d slice: %d\n",len(s),cap(s),s)
}
func main(){
//不指定长度和容量
var s1 []int
s2 := []int{1,2,3,4}
//指定长度
s3 := make([]int,2)
//指定长度和容量
s4 := make([]int,3,16)
printS(s1) //len: 0 cap: 0 slice: []
printS(s2) //len: 4 cap: 4 slice: [1 2 3 4]
printS(s3) //len: 2 cap: 2 slice: [0 0]
printS(s4) //len: 3 cap: 16 slice: [0 0 0]
}
三.给切片添加元素
s1 := []int {1,2,3}
s2 := []int {4,5,6}
fmt.Println(append(s1,4,5,6))
fmt.Println(append(s1,s2...))
四.切片的拷贝:
s1 := make([]int,4)
s2 := []int{1,2,3,4}
copy(s1,s2) //parms1:dest parms2:src
fmt.Println(s1) //[1 2 3 4]
//这里注意,s1的长度一定要大于等于s2才能全部拷贝
s1 := make([]int,3)
s2 := []int{1,2,3,4}
copy(s1,s2) //parms1:dest parms2:src
fmt.Println(s1) //[1 2 3]
四.从切片中间删除元素:
s := []int{1,2,3,4}
s = append(s[:1],s[2:]...)
fmt.Println(s)
五.从切片头部删除元素
s := []int{1,2,3,4}
s = s[1:]
fmt.Println(s) //[2 3 4]
六.从切片尾部删除元素
s := []int{1,2,3,4}
s = s[:len(s)-1]
fmt.Println(s) //[1 2 3]