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

本文通过示例代码展示了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() 方法的基础结构要定义成切片类型,而非其他类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值