go语言的数组与切片 - Go语言中文社区

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: %dn",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]
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42565137/article/details/91357367
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢