を、外出先での「ディープコピー」という概念はありません、すべてがあります値渡し。
何のあなたのサンプルも、あなたはポインタ(文字列のアドレス)を渡さ浅いコピーではないではありません。
あなたが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?