问个go关于 slice传参问题
我觉得 slice 传参的话,就是把slice这个结构体(data, len, cap)深拷贝一份给函数,然后此时函数里面的slice和外面的slice已经就不是一个了,然后如果函数里面在不影响 slice长度改变情况下修改某个元素值的话,修改会成功,因为 它们的data指向一个数组。如果函数里面影响了slice的cap,也就是触发了扩容操作(例如append操作),那么我认为 是data的指向的数组会改变,所以再次修改 元素时候就不会影响到外面的slice的data指向的数组。
真的感觉有点迷,我现在的这个思路有问题吗?求指教。
引流: #现在还是0offer,延毕还是备考# #牛客解忧铺# #牛客在线求职答疑中心# go
真的感觉有点迷,我现在的这个思路有问题吗?求指教。
引流: #现在还是0offer,延毕还是备考# #牛客解忧铺# #牛客在线求职答疑中心# go
全部评论
你的理解基本上是正确的。在 Go 中,slice 是一个引用类型,它包含了一个指向底层数组的指针、长度和容量。当你将一个 slice 作为参数传递给函数时,实际上是将 slice 的副本传递给函数,但是这个副本仍然指向相同的底层数组。
如果函数内部修改了 slice 的长度(例如使用 append 函数),那么会创建一个新的底层数组,并将原有的元素复制到新的数组中。这时,函数内部的 slice 和外部的 slice 将指向不同的底层数组。
如果函数内部只是修改了 slice 中的某个元素的值,而不改变长度,那么修改会影响到外部的 slice,因为它们共享同一个底层数组。
总结起来,当你传递一个 slice 给函数时,函数内部对 slice 的修改会影响到外部的 slice,除非函数内部改变了 slice 的长度。
路过的大佬有不同见解吗?
相关推荐
点赞 评论 收藏
分享