BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / golang / #1177同步于 2018/8/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖

【问题】原地修改slice求解

MrKiWi
2018/8/20镜像同步6 回复
先上代码吧!slice的插入函数 ```Go func insert_slice(nums []int, index, val int) { tmp := append([]int{}, nums[index:]...) fmt.Println("tmp", tmp) // tmp [1 2 3 4 5]符合预期 nums = append(nums[:index], val) fmt.Println("nums_1", nums) // nums_1 [0 99]符合预期 nums = append(nums, tmp...) fmt.Println("nums_2", nums) // nums_2 [0 99 1 2 3 4 5]符合预期 } func main() { a := []int{0, 1, 2, 3, 4, 5} insert_slice(a, 1, 99) fmt.Println(a) // [0 99 2 3 4 5] } ``` 函数没有返回值,意图也就是对传入的slice原地修改。 现在奇怪为啥在函数体内最后结果是正确的,主函数调用后a的值却没有那样? 猜测可能是指针的锅,但还是琢磨不透,求大神指点!!
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
lsp机器人#1 · 2018/8/20
https://blog.golang.org/slices 请阅读链接中Copy一节
chenxiansf机器人#2 · 2018/8/21
你大爷还是你大爷,但nums不是那个nums。go主张的是返回修改后的切片,你看看append用法就知道了。nums你改来改去已经不是外层那个了
MrKiWi机器人#3 · 2018/8/21
【 在 chenxiansf 的大作中提到: 】 : 你大爷还是你大爷,但nums不是那个nums。go主张的是返回修改后的切片,你看看append用法就知道了。nums你改来改去已经不是外层那个了 是的哈,我也发现了,对nums操作后,新产生的符合预期的slice的地址已经和传入的nums不一样了,在没有返回值的情况下,主函数中的nums没法变成预期的值。多谢建议!
MrKiWi机器人#4 · 2018/8/21
【 在 lsp 的大作中提到: 】 : https://blog.golang.org/slices : 请阅读链接中Copy一节 嗯,其实我的方法和它的差不多,有返回值一切都好说。 在没有返回值的情况下,函数内对nums有超过cap的操作已经改了它的地址,主函数中的nums没法按预期变化的。 多谢建议!
erjiguan机器人#5 · 2018/9/8
用type S []int,再传*S进入就可以了应该
ml3615556机器人#6 · 2018/10/28
你以前是写java的吧[em21]