返回信息流【 以下文字转载自 Board_Apply 讨论区 】
发信人: nullne (nullne), 信区: Board_Apply
标 题: 【范文二】 Go大坑
发信站: 北邮人论坛 (Sat May 28 15:32:12 2016), 站内
废话不说看代码:
package main
import (
"fmt"
)
func modify(slice []int) {
slice = append(slice, 6)
}
func main() {
slice := []int{1, 2, 3, 4, 5}
modify(slice)
fmt.Println(slice)
}
结果:
[1 2 3 4 5]
求大神解释,跪谢
这是一条镜像帖。来源:北邮人论坛 / golang / #2同步于 2016/6/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
【范文二】 Go大坑 (转载)
paper777
2016/6/7镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
并不是你说的这样的。
通常情况下go语言中的变量持有相应的值。
除了“通道、函数、方法、映射、切片”,它们持有的是引用。
例如
package main
import (
"fmt"
)
func modify(slice []int) {
slice[0] = 2
}
func main() {
slice := []int{1, 2, 3, 4, 5}
modify(slice)
fmt.Println(slice)
}
输出是[2 2 3 4 5]
lz说的问题实际上是因为此时append返回了一个新的切片
并不是任何时候,append都会返回新的切片的,这取决于切片的cap够不够
所以,如果把lz代码中的append,改成new_slice()
问题就很好理解了。
【 在 b78859793 的大作中提到: 】
: Go就是这样的啊,写Python写多了不适应了吧 想改变就得传指针嘛,Go其实还是比较接近C的。。
嗯
【 在 buptxrc 的大作中提到: 】
: 并不是你说的这样的。
: 通常情况下go语言中的变量持有相应的值。
: 除了“通道、函数、方法、映射、切片”,它们持有的是引用。
:
: 例如
:
【 在 buptxrc 的大作中提到: 】
: 并不是你说的这样的。
: 通常情况下go语言中的变量持有相应的值。
: 除了“通道、函数、方法、映射、切片”,它们持有的是引用。
: ...................
为什么返回了新切片slice的内容就不会被改变呢,它返回的新切片名字也还是slice呀,既然打印的是slice那就应该打印更新过的内容呀?
但是此时函数里的slice和函数外的slice已经是两个对象了
【 在 shenchangli 的大作中提到: 】
:
: 为什么返回了新切片slice的内容就不会被改变呢,它返回的新切片名字也还是slice呀,既然打印的是slice那就应该打印更新过的内容呀?
append之前,modify里面的slice和外面的slice不是同一个变量,但是这两个变量引用了同一内容;append之后,外面的slice还是引用原内容,modify里面的slice引用append返回的新的内容,对外面的slice没影响。
c语言对应过来大概可以这么理解。
//main函数内
obj obj1;
obj *outer_slice=&obj1;
//调用modify,outer_slice传入modify函数内
obj *inner_slice=outer_slice;
//modify中的append
obj obj2;
inner_slice=&obj2;
//问:此时outer_slice有改变吗?
java里面类似。
//main函数内
obj outer_slice=new obj();
//调用modify,outer_slice传入modify函数内
obj inner_slice=outer_slice;
//modify中的append
inner_slice=new obj();
//问:此时outer_slice有改变吗?
【 在 shenchangli 的大作中提到: 】
:
: 【 在 buptxrc 的大作中提到: 】
: : 并不是你说的这样的。
: : 通常情况下go语言中的变量持有相应的值。
: : 除了“通道、函数、方法、映射、切片”,它们持有的是引用。
:
: .........