2016-08-01 43 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 
    // ... 
}