的方式,我有一些問題,用下面的代碼:建議使用sync.WaitGroup與外部功能
package main
import (
"fmt"
"sync"
)
// This program should go to 11, but sometimes it only prints 1 to 10.
func main() {
ch := make(chan int)
var wg sync.WaitGroup
wg.Add(2)
go Print(ch, wg) //
go func(){
for i := 1; i <= 11; i++ {
ch <- i
}
close(ch)
defer wg.Done()
}()
wg.Wait() //deadlock here
}
// Print prints all numbers sent on the channel.
// The function returns when the channel is closed.
func Print(ch <-chan int, wg sync.WaitGroup) {
for n := range ch { // reads from channel until it's closed
fmt.Println(n)
}
defer wg.Done()
}
我得到在指定的地點死鎖。我試圖設置wg.Add(1)
而不是2,它解決了我的問題。我的觀點是,我沒有成功地將頻道作爲參數發送給Printer
函數。有沒有辦法做到這一點?否則,我的問題的解決方案替換與go Print(ch, wg)
行:
go func() {
Print(ch)
defer wg.Done()
}
和改變Printer
功能:
func Print(ch <-chan int) {
for n := range ch { // reads from channel until it's closed
fmt.Println(n)
}
}
什麼是最好的解決辦法嗎?
明白了,我不知道你所需要的地址是發送給'Print'而不是'WaitGroup'本身。 我同意該方法不需要知道'WaitGroup',但假設我想要這個。那麼,明星呢?它是否挑出了我在'main'中定義的ACTUAL'WaitGrooup'?爲什麼這個不是副本? – Sahand
'* sync.WaitGroup'告訴編譯器你想要一個指向WaitGroup而不是WaitGroup的指針。所以編譯器希望你通過給它一個地址來調用這個方法,所以'&wg'。 – Elwinar
如果您只等待發件人完成,請勿認爲您可以刪除打印的等待組作爲主的wg.Wait可能在打印上一個值之前遇到。另外,沒有理由以延遲wg.Done()結束函數,延遲基本上意味着,最後運行這個函數。放棄推遲 –