2 回答

TA貢獻1818條經(jīng)驗 獲得超7個贊
發(fā)送指向值的指針是正常且常見的。如果值很大,發(fā)送一個指向該值的指針會比發(fā)送該值更高效。運行基準測試以找出“大”有多大。
需要注意的是,您必須防止對值進行不安全的并發(fā)訪問。防止不安全并發(fā)訪問的常見策略有:
將值的所有權(quán)從發(fā)送方傳遞給接收方。發(fā)送者發(fā)送后不訪問該值。接收者可以對這個值做任何它想做的事情。
發(fā)送后將該值視為只讀。發(fā)送者或接收者都不會在發(fā)送后修改該值。

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)檢測器并不完美,但它通常會檢測到類似的東西。
- 2 回答
- 0 關(guān)注
- 231 瀏覽
添加回答
舉報