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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過通道將在 goroutine 中分配的結(jié)構(gòu)有效地傳遞回主程序?

如何通過通道將在 goroutine 中分配的結(jié)構(gòu)有效地傳遞回主程序?

Go
慕勒3428872 2021-08-16 20:07:47
在基本層面上,我有一個主程序,它產(chǎn)生多個 goroutine 來處理數(shù)據(jù)。每次 goroutine 處理數(shù)據(jù)時,它都會發(fā)回一個不同大小的結(jié)構(gòu)(它包含每次從 goroutine 內(nèi)部分配的切片和/或數(shù)組)。數(shù)據(jù)不是很大(比如幾兆字節(jié)),但總的來說,傳輸指向數(shù)據(jù)的指針與傳輸數(shù)據(jù)的副本相比是否更有效(并且安全)?如果數(shù)據(jù)結(jié)構(gòu)是靜態(tài)的并且我傳輸了一個指向它的指針,那么在我仍在處理上一次調(diào)用的結(jié)果時,結(jié)構(gòu)可能會發(fā)生變化(如果它完全重新分配,那么這可能不是問題)。
查看完整描述

2 回答

?
qq_笑_17

TA貢獻1818條經(jīng)驗 獲得超7個贊

發(fā)送指向值的指針是正常且常見的。如果值很大,發(fā)送一個指向該值的指針會比發(fā)送該值更高效。運行基準測試以找出“大”有多大。

需要注意的是,您必須防止對值進行不安全的并發(fā)訪問。防止不安全并發(fā)訪問的常見策略有:

  • 將值的所有權(quán)從發(fā)送方傳遞給接收方。發(fā)送者發(fā)送后不訪問該值。接收者可以對這個值做任何它想做的事情。

  • 發(fā)送后將該值視為只讀。發(fā)送者或接收者都不會在發(fā)送后修改該值。


查看完整回答
反對 回復(fù) 2021-08-16
?
翻閱古今

TA貢獻1780條經(jīng)驗 獲得超5個贊

根據(jù)我的理解,您正在嘗試執(zhí)行以下操作:


func watchHowISoar() (ch chan *bigData) {

    ch = make(chan *bigData)

    go func() {

        for i := 0; i < 10; i++ {

            bd := &bigData{i}

            ch <- bd

            // as long as you don't modify bd inside this goroutine after sending it, you're safe.

        }

        close(ch)

    }()

    return

}

func main() {

    for iamaleafOnTheWind := range watchHowISoar() {

        fmt.Printf("%p\n", iamaleafOnTheWind)

    }

}

只要您在發(fā)送后不修改來自發(fā)件人的發(fā)送數(shù)據(jù),它就是完全安全的。


如果您有疑問,請嘗試使用 運行它go run -race main.go,雖然競態(tài)檢測器并不完美,但它通常會檢測到類似的東西。


查看完整回答
反對 回復(fù) 2021-08-16
  • 2 回答
  • 0 關(guān)注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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