![](/img/trans.png)
[英]How to pass head from main to addNode function ? (LinkedList implementation via struct)
[英]How do I efficiently pass a struct allocated in a goroutine back to the main routine via a channel?
在基本級別上,我有一個主例程,該例程生成多個goroutine來處理數據。 每次goroutine處理數據時,它都會發回一個大小可變的結構(每次都包含從goroutine內部分配的切片和/或數組)。
數據不是很大(例如,幾兆字節),但是總的來說,將指針轉移到數據而不是全部副本是否更有效(並且更安全)? 如果數據結構是靜態的,並且我將指針傳遞給它,則有可能在我仍在處理上一次調用的結果時更改結構(如果它已完全重新分配,那么這可能不是問題)。
發送指向值的指針是可以的並且很常見。 如果該值較大,則發送指向該值的指針將比發送該值更有效。 運行基准以找出“大”的大小。
注意,您必須防止不安全的並發訪問該值。 防止不安全的並發訪問的常見策略是:
據我了解,您正在嘗試執行以下操作:
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)
}
}
只要您在發送后不修改發件人發送的數據,這是絕對安全的。
如果您有疑問,請嘗試使用go run -race main.go
來運行它,而種族檢測器並不完美,它通常會檢測出類似的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.