2016-08-01 87 views
1

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

没有“句柄”(指针)“容器” - 你是通过值返回结构,而不是指向它的指针。 –

回答

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 
} 

现在主要有一个指针指向上述instance,通过做够程的修改将是明显的。

例子: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 
    // ... 
} 
相关问题