第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

goroutine 是創(chuàng)建深拷貝還是淺拷貝?

goroutine 是創(chuàng)建深拷貝還是淺拷貝?

Go
森林海 2022-01-17 20:11:57
var person struct {    name string    id   int    phone int}func main () {    var myTest person    //construct the variable     ...    go func() {        fmt.Println(myTest.name)    }()}goroutine 是否從主函數(shù)中深度復(fù)制變量“myTest”?如果我的 goroutine 是這樣的:go func() {    time.Sleep(10 * time.Second)    fmt.Println(myTest.name)}這個(gè) goroutine 休眠了 10 秒,那么當(dāng) main 函數(shù)在 10 秒內(nèi)改變“myTest”的值時(shí),goroutine 會(huì)做什么呢?
查看完整描述

2 回答

?
MYYA

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()

}


查看完整回答
反對(duì) 回復(fù) 2022-01-17
?
滄海一幻覺(jué)

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)


查看完整回答
反對(duì) 回復(fù) 2022-01-17
  • 2 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)