Golang——切片

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

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

2.初始化

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

//数组初始化
arr := [...]{
   1,2,3}
arr := [3]{
   1,2,3}

初始化踩坑:

此时,a!= nil
a := []int{
   } 

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

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]

5.for range

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

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

c := make([]int,4,8)//[0000]
fmt.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值