我有一个具有数组字段的结构实例。当goroutine替换实例上的数组时,该实例的所有其他句柄仍然具有原始数组。为什么是这样?我应该更改什么,以便下面Container
的实例能反映出对goroutine所做的更改?
这里也反映了一个简单的例子:https://play.golang.org/p/dXVKN6o8aP
func Create() Container {
instance := *&Container{
values: []string{"initial value"},
}
go func() {
instance.values = []string{"modified value"}
fmt.Print("values updated")
}()
return instance
}
func main() {
instance := Create()
time.Sleep(100 * time.Millisecond)
fmt.Printf("%[1]v", instance.values)
//prints "initial value", but I expected "modified value"
}
答案 0 :(得分:3)
这是因为您正在使用切片的值。您将返回通过复制返回到main
的切片的值。 Goroutine然后执行并更新原始值。进行以下更改:
func Create() *Container { // return a pointer to container
// instance is now initialized and points to a Container value
// (i.e. instance is of type *Container)
instance := &Container{
values: []string{"initial value"},
}
go func() {
instance.values = []string{"modified value"}
fmt.Print("values updated")
}()
return instance
}
现在main有一个指向上面instance
的指针,goroutine完成的修改将会显示。
示例:https://play.golang.org/p/AKwUZfTu0s
此外,要创建新值,您可以直接使用类型名称:
instance := Container{ // instance is of type Container
// ...
}
要创建和初始化类型的指针,请使用:
instance := &Container{ // instance is of type *Container
// ...
}
执行以下操作是多余的:
instance := *&Container{ // instance is of type Container. Same as first declaration
// ...
}