2016-06-23 12 views
0
var person struct { 
    name string 
    id int 
    phone int 
} 

func main() { 
    var myTest person 
    //construct the variable 
    ... 


    go func() { 
     fmt.Println(myTest.name) 
    }() 
} 

はゴルーチンは深く、main関数から変数「MYTEST」をコピーしていますか?goroutineはディープコピーかシャローコピーを作成しますか?

このように私のゴルーチン場合:

go func() { 
    time.Sleep(10 * time.Second) 
    fmt.Println(myTest.name) 
} 

このゴルーチンスリープ10秒は、その主な機能は、10秒の間に「MYTEST」の値を変更したときに、何が行うゴルーチンのだろうか?外出先での「ディープコピー」という概念はありません

答えて

3

を、外出先での「ディープコピー」という概念はありません、すべてがあります値渡し。
何のあなたのサンプルも、あなたはポインタ(文字列のアドレス)を渡さ浅いコピーではないではありません。
あなたがmain機能でmyTest.nameを変更するならば、あなたはこの証明を参照してください、それが変更されます表示されます、その変更後に再びそれを印刷サンプルコード:ゴルーチンが終了するのを待つために

type person struct { 
    name string 
    id int 
    phone int 
} 

二次利用sync.WaitGroup

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

type person struct { 
    name string 
    id int 
    phone int 
} 

var wg sync.WaitGroup 

func main() { 
    myTest := person{"Alex", 22, 123} 
    fmt.Printf("%T : %[1]v %v\n", myTest.name, &myTest.name) // string : Alex 0xc042006740 
    wg.Add(1) 
    go func() { 
     fmt.Printf("%T : %[1]v %v\n", myTest.name, &myTest.name) // string : Alex 0xc042006740 
     time.Sleep(500 * time.Millisecond) 
     fmt.Printf("%T : %[1]v %v\n", myTest.name, &myTest.name) // string : J 0xc042006740 
     wg.Done() 
    }() 
    time.Sleep(100 * time.Millisecond) 
    myTest.name = "J" 
    wg.Wait() 
} 

が最初にこのようperson structを定義します。

とあなたの主な質問について、あなたはこのようにそれを自分でテストすることができます:それはないですので、あなたは、このサンプルでは、​​main関数内の文字列nameコンテンツの変更を参照してくださいように

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

type person struct { 
    name string 
    id int 
    phone int 
} 

var wg sync.WaitGroup 

func main() { 
    myTest := person{"Alex", 22, 123} 
    wg.Add(1) 
    go func() { 
     fmt.Printf("%T : %[1]v\n", myTest.name) // string : Alex 
     time.Sleep(500 * time.Millisecond) 
     fmt.Printf("%T : %[1]v\n", myTest.name) // string : J 
     wg.Done() 
    }() 
    time.Sleep(100 * time.Millisecond) 
    myTest.name = "J" 
    wg.Wait() 
} 

は、ゴルーチンに反映しましたコピー。
あなたは、このように呼んでコピーする必要がある場合:

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

type person struct { 
    name string 
    id int 
    phone int 
} 

var wg sync.WaitGroup 

func main() { 
    myTest := person{"Alex", 22, 123} 
    wg.Add(1) 
    go func(name string) { 
     fmt.Printf("%T : %[1]v\n", name) // string : Alex 
     time.Sleep(500 * time.Millisecond) 
     fmt.Printf("%T : %[1]v\n", name) // string : Alex 
     wg.Done() 
    }(myTest.name) 
    time.Sleep(100 * time.Millisecond) 
    myTest.name = "J" 
    wg.Wait() 
} 

と参照: Is it correct to ref a var inside golang func?

0

、すべてが値によって渡されます。あなたがコピーしたい場合は、あなたのインスタンスで

が、それはコピーではありません、あなたは直接変数を参照している、ような何か:

myTest := myTest 
time.Sleep(10 * time.Second) 
fmt.Println(myTest.name) 
関連する問題