返回信息流先上代码吧!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的值却没有那样?
猜测可能是指针的锅,但还是琢磨不透,求大神指点!!
这是一条镜像帖。来源:北邮人论坛 / golang / #1177同步于 2018/8/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
【问题】原地修改slice求解
MrKiWi
2018/8/20镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
【 在 chenxiansf 的大作中提到: 】
: 你大爷还是你大爷,但nums不是那个nums。go主张的是返回修改后的切片,你看看append用法就知道了。nums你改来改去已经不是外层那个了
是的哈,我也发现了,对nums操作后,新产生的符合预期的slice的地址已经和传入的nums不一样了,在没有返回值的情况下,主函数中的nums没法变成预期的值。多谢建议!
【 在 lsp 的大作中提到: 】
: https://blog.golang.org/slices
: 请阅读链接中Copy一节
嗯,其实我的方法和它的差不多,有返回值一切都好说。
在没有返回值的情况下,函数内对nums有超过cap的操作已经改了它的地址,主函数中的nums没法按预期变化的。
多谢建议!