2 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
Go 中沒(méi)有“深拷貝”的概念,一切都是按值傳遞的。
不,你的樣本甚至不是一個(gè)淺拷貝你傳遞了一個(gè)指針(字符串的地址):
如果你改變myTest.name了main函數(shù),那么你在改變之后再次打印它,你會(huì)看到它會(huì)改變,請(qǐng)看這個(gè)證明示例代碼:
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這樣定義:
type person struct {
name string
id int
phone int
}
第二次使用sync.WaitGroup等待 goroutine 完成。
關(guān)于你的主要問(wèn)題,你可以像這樣自己測(cè)試:
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()
}
因此,正如您在此示例中看到的name,主函數(shù)中的字符串內(nèi)容更改反映到 goroutine,因此它不是副本。
如果您需要這樣的復(fù)制調(diào)用:
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()
}

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
Go 中沒(méi)有“深拷貝”的概念,一切都是按值傳遞的。
在您的實(shí)例中,這不是副本,您直接引用變量,如果您想要副本執(zhí)行以下操作:
myTest := myTest
time.Sleep(10 * time.Second)
fmt.Println(myTest.name)
- 2 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報(bào)