2016-08-01 9 views
1

配列フィールドを持つ構造体のインスタンスがあります。ゴルーチンがインスタンス上の配列を置き換えると、そのインスタンスに対する他のすべてのハンドルは元の配列を持ちます。どうしてこれなの?私は以下のContainerのインスタンスがゴルーチンに加えられた変更を反映するように変更する必要がありますか?インスタンス上で置換された文字列配列が反映されない

簡単な例は、ここにも反映されている: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

"Container"には "ハンドル"(ポインタ)はありません。構造体をポインタではなく値で返します。 –

答えて

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 
    // ... 
} 
関連する問題