go 数组与slice的区别

总结:

1. 数组定长,定义的时候就需要确定。切片长度不定,append时会自动扩容

2. 相同大小数组可以赋值,会拷贝全部内容。slice赋值和指针一样。数组和slice之间不能相互赋值。当然slice有自己的copy函数

3. 数组也可以进行切片,返回值是一个slice,改变slice时会同步修改数组内容,相当于取得了这个数组的指针

测试:

1. 数组定长,定义的时候就需要确定。切片长度不定,append时会自动扩容

// 数组定义方式
// 1 写明长度
c1 := [5]int{1, 2, 3}    
// 2 自动获取长度
c2 := [...]int{1, 2, 3}

// slice定义方式
// 1 不写明长度就是slice
c5 := []int{1, 2, 3}
// 2 使用make定义的也是slice
c6 := make([]int, 5, 10) // 5 是其长度,10 是其容量(可选),分别可以通过 len(sli)  cap(sli) 获取

2. slice支持append操作, 数组不支持

c8 = append(c8, 22) // 
c2 = append(c2, 10) // err:first argument to append must be slice; have [3]int

3. 数组赋值时会拷贝内容,slice会赋值引用和指针一样

// 数组拷贝测试
c1 := [...]int{1, 2, 3}
c2 := [...]int{4, 5, 6}
c3 := c2
c2 = c1
c2[2] = 10
fmt.Println("c1", c1, len(c1), cap(c1))
fmt.Println("c2", c2, len(c2), cap(c2))
fmt.Println("c3", c3, len(c3), cap(c3))

// result
c1 [1 2 3] 3 3    // c1 没有随c2的赋值改变
c2 [1 2 10] 3 3   // c2 拷贝了一份c1, 不同长度的数组不能拷贝
c3 [4 5 6] 3 3    // c3 拷贝了一份c2
// slice 拷贝测试
c5 := []int{1, 2, 3}
c6 := make([]int, 5, 10)
c7 := c6
c6 = c5
c6[2] = 20
fmt.Println("c5", c5, len(c5), cap(c5))
fmt.Println("c6", c6, len(c6), cap(c6))
fmt.Println("c7", c7, len(c7), cap(c7))


// result
c5 [1 2 20] 3 3        // c5 内容 随c6的赋值改变了
c6 [1 2 20] 3 3        // c6 取得了对c5内容的引用
c7 [0 0 0 0 0] 5 10    // c7 取得了对c6原来内容的引用

4. 数组也可以进行切片,返回值是slice,改变slice时会同步修改数组内容,相当于取得这个数组的指针

c8 := c1[:1]
c8 = append(c8, 22)
c8 = append(c8, 22)
c8 = append(c8, 22)
fmt.Println("c1", c1, len(c1), cap(c1))
fmt.Println("c8", c8, len(c8), cap(c8))

// result
c1 [1 22 22] 3 3        // 数组内容发生改变,但长度不会改变
c8 [1 22 22 22] 4 6     // slice取得了数组c1的引用

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值