未反映实例上替换的字符串数组

时间:2016-08-01 12:51:13

标签: go

我有一个具有数组字段的结构实例。当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"
}

1 个答案:

答案 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
    // ...
}