我已將以下內容添加到 stdout 和 stderr goroutine (go func() …) 以等待獲取output并error完成。現在我希望外部函數將等待兩個例程完成。func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {scanout := bufio.NewScanner(stdout)scanout.Split(bufio.ScanRunes)go func() { for scanout.Scan() { fmt.Print(scanout.Text()) }}()go func() {scanerr.Split(bufio.ScanRunes) for scanerr.Scan() { fmt.Print(scanerr.Text()) }}()}現在我嘗試添加等待組,但它不起作用,因為我不確定如何傳遞等待組實例,知道嗎?func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {scanout := bufio.NewScanner(stdout)scanout.Split(bufio.ScanRunes)var waitgroup sync.WaitGroupwaitgroup.Add(1)go func() { for scanout.Scan() { fmt.Print(scanout.Text()) }}()waitgroup.Wait()waitgroup.Add(1)go func() {scanerr.Split(bufio.ScanRunes) for scanerr.Scan() { fmt.Print(scanerr.Text()) }}()waitgroup.Wait()}更新應該是這樣嗎?func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {scanout := bufio.NewScanner(stdout)scanout.Split(bufio.ScanRunes)var waitgroup sync.WaitGroupwaitgroup.Add(2)go func() { for scanout.Scan() { fmt.Print(scanout.Text()) }}()go func() {scanerr.Split(bufio.ScanRunes) for scanerr.Scan() { fmt.Print(scanerr.Text()) }}()waitgroup.Wait()}
1 回答

慕森卡
TA貢獻1806條經驗 獲得超8個贊
您不需要將WaitGroup
實例傳遞給 goroutine,因為您使用的是函數文字,您可以直接引用在周圍函數中聲明的變量。
您也可以省略第二個 goroutine,它對于您的用例來說并不是真正需要的。
func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {
? ? scanout := bufio.NewScanner(stdout)
? ? scanout.Split(bufio.ScanRunes)
? ? var wg sync.WaitGroup
? ? wg.Add(1)
? ? // exec scanout in its own goroutine
? ? go func() {
? ? ? ? for scanout.Scan() {
? ? ? ? ? ? fmt.Print(scanout.Text())
? ? ? ? }
? ? ? ? wg.Done()
? ? }()
? ? // exec scanerr
? ? scanerr.Split(bufio.ScanRunes)
? ? for scanerr.Scan() {
? ? ? ? fmt.Print(scanerr.Text())
? ? }
? ? // wait for scanout
? ? wg.Wait()
}
- 1 回答
- 0 關注
- 127 瀏覽
添加回答
舉報
0/150
提交
取消