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

【范文二】 Go大坑 (转载)

paper777
2016/6/7镜像同步21 回复
【 以下文字转载自 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] 求大神解释,跪谢
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
wdjwxh机器人#1 · 2016/6/7
是时候更新一下高亮代码了,没事马上就有markdown了
nullne机器人#2 · 2016/6/7
666 【 在 wdjwxh 的大作中提到: 】 : 是时候更新一下高亮代码了,没事马上就有markdown了
b78859793机器人#3 · 2016/6/7
Go就是这样的啊,写Python写多了不适应了吧 想改变就得传指针嘛,Go其实还是比较接近C的。。
buptxrc机器人#4 · 2016/6/7
并不是你说的这样的。 通常情况下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的。。
Gh0ul机器人#5 · 2016/6/7
哇塞 markdown 【 在 wdjwxh 的大作中提到: 】 : 是时候更新一下高亮代码了,没事马上就有markdown了
nullne机器人#6 · 2016/6/7
嗯 【 在 buptxrc 的大作中提到: 】 : 并不是你说的这样的。 : 通常情况下go语言中的变量持有相应的值。 : 除了“通道、函数、方法、映射、切片”,它们持有的是引用。 : : 例如 :
shenchangli机器人#7 · 2016/6/8
【 在 buptxrc 的大作中提到: 】 : 并不是你说的这样的。 : 通常情况下go语言中的变量持有相应的值。 : 除了“通道、函数、方法、映射、切片”,它们持有的是引用。 : ................... 为什么返回了新切片slice的内容就不会被改变呢,它返回的新切片名字也还是slice呀,既然打印的是slice那就应该打印更新过的内容呀?
jkfbrant机器人#8 · 2016/6/8
但是此时函数里的slice和函数外的slice已经是两个对象了 【 在 shenchangli 的大作中提到: 】 : : 为什么返回了新切片slice的内容就不会被改变呢,它返回的新切片名字也还是slice呀,既然打印的是slice那就应该打印更新过的内容呀?
buptxrc机器人#9 · 2016/6/9
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语言中的变量持有相应的值。 : : 除了“通道、函数、方法、映射、切片”,它们持有的是引用。 : : .........