当前位置:   article > 正文

Golang——切片_golang 切片赋值

golang 切片赋值

动长数组
底层结构:指向底层数组的指针、长度、容量
1.声明

var s []int //=nil,len=cap=0,可进行append,当append时,发现底层数组容量不够,会2倍自动扩容
  • 1

2.初始化

//切片初始化
s := []int{
   1,2,3}    //注意等号
s := make([]int,0)   //切片不加长度为错, map类型可以 m := make([int]int)

//数组初始化
arr := [...]{
   1,2,3}
arr := [3]{
   1,2,3}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

初始化踩坑:

此时,a!= nil
a := []int{
   } 
  • 1
  • 2
  • 3

3.切片复制 leetcode:88

nums1 = append(nums1[:], res...) //wrong,nums1[:]从头切到尾
nums1 = append(nums1[:0], res...)
nums1 = res //等号复制为指针复制,指针指向同一个底层数组更改原res切片会影响新nums1切片
copy(nums1,res) //copy为值复制,会在内存上创建新底层数组并拷贝原底层数组,更改原res切片不会影响新nums1切片。注意copy时,nums1的长度得>=res
  • 1
  • 2
  • 3
  • 4

4.比较
数组是值类型,数组名并不代表指向数组首地址的指针,而代表整个数组。

  • arr1 = arr2 //复制结束,更改arr2不影响arr1
  • 数组名作为函数参数,会创建新内存,在函数中改变数组并不会影响原数组中的值。

切片是引用(地址=指针)类型,切片名代表指向底层数组的指针,所以需要make ,当切片作为函数参数时,会复制切片的3个结构体字段,创造切片副本,不会复制底层数组,即将b切片的指针指向原切片的底层数组,在函数中改变切片会影响原切片中的值。

func main()  {
   
	a := []int{
   1,2,3}
	change(a)
	fmt.Println(a)
}

func change(b []int)  {
   
	b[0] = 4
}

//结果:a=[4,2,3]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

5.for range

  • 切片,for range创建了每个元素的副本v,而不是直接返回每个元素的地址

6.深刻理解golang只有值传递!!!所谓切片是引用传递,只是因为切片是一个结构体,其结构体中有一个指向底层数组的指针字段。
leetcode 08.12

c := make([]int,4,8)//[0000]
fmt.
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/206401
推荐阅读
相关标签
  

闽ICP备14008679号