Go 语言中切片和数组的区别

func ChangeArray(s [3]string) {
	s[1] = "bob"
}

func ChangeSlice(s []string) {
	s[1] = "bob"
}

func main() {
	name := [3]string{"eighty", "don", "jean"}
	ChangeArray(name)

	name_s := []string{"eighty", "don", "jean"}
	ChangeSlice(name_s)

	fmt.Println(name)
	fmt.Println(name_s)

}

输出:

[eighty don jean]
[eighty bob jean]

这表明对于传参拷贝的副本来说,数组的副本是真的副本,而切片的副本要么是指针要么是类似于引用的东西。

看了一下 go语言圣经(图文全部摘自该书,侵删)

一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址。


所以,slice 的拷贝其实是 c++ 中的指针传参。

这就解释为什么 sort.Sort() 方法的基础结构要定义成切片类型,而非其他类型。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值