欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

go语言的数组与切片

程序员文章站 2024-01-29 23:46:04
...

数组

一.定义数组
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)
}

三.数组是值传递
go语言的数组与切片
如果在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]