Golang阵列更新不起作用

时间:2016-11-22 07:09:27

标签: arrays go struct

来自Java世界的Golang新手。我有这个非常简单的程序:

package main

import "fmt"

type Foo struct {
  A [5]int
}

func main() {
  s := make([]Foo, 0)
  var foo Foo
  s = append(s, foo)
  foo.A[0] = 42
  fmt.Printf("%v", s[0].A)
}

然而,这会打印出我预期的[0,0,0,0,0]而不是[42,0,0,0,0]。交换行s = append(s, foo)foo.A[0] = 42后,它会打印[42,0,0,0,0]。这是为什么?提前谢谢。

2 个答案:

答案 0 :(得分:2)

在您的示例中,您将foo当前存在于s。这会按值复制foo,并创建附加到foo的{​​{1}}副本。当您打印s时,您需要将新创建的(初始化为0时)s打印到foo,而不是修改后的s数组

当您切换foos = append(s, foo)时,您正在做同样的事情,但这次您看到了预期的结果,因为您正在复制{{ 1}}数组,带有42,进入foo.A[0] = 42。如果您再次修改foos仍然会给您foo

答案 1 :(得分:1)

select convert(varchar(10), cast(ltrim(rtrim(replace('20162211', '"', ''))) as datetime), 112) [mydate] 是一个包含s类型元素的切片。 Foo是结构类型。分配给值时,作为参数传递或附加到切片的结构将按值复制。您的Foo行正在向append添加foo副本,而您打算将{em>引用添加到s }。

要修复,请将{{1>}一段指针添加到您的结构中:

foo

playground link

对于那些只是痛苦地经历过痛苦的人来说,指针似乎很可怕。在go中,它们只是允许您控制是否要复制某些内容或将引用传递给它。