来自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]
。这是为什么?提前谢谢。
答案 0 :(得分:2)
在您的示例中,您将foo
当前存在于s
。这会按值复制foo
,并创建附加到foo
的{{1}}副本。当您打印s
时,您需要将新创建的(初始化为0时)s
打印到foo
,而不是修改后的s
数组
当您切换foo
和s = append(s, foo)
时,您正在做同样的事情,但这次您看到了预期的结果,因为您正在复制{{ 1}}数组,带有42,进入foo.A[0] = 42
。如果您再次修改foo
,s
仍然会给您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
对于那些只是痛苦地经历过痛苦的人来说,指针似乎很可怕。在go中,它们只是允许您控制是否要复制某些内容或将引用传递给它。