2 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
正如 Dave C 和 JimB 所說,使用通道來協(xié)調(diào) goroutine。這是一個(gè)可能會(huì)有所幫助的示例。
收到用戶的5條消息后退出:
package main
import "fmt"
var pipe = make(chan string) //shares text entered by user
var stop = make(chan bool) //shares stop signal
func listen() {
for {
var input string
fmt.Scan(&input)
pipe <- input
}
}
func write() {
for i := 0; i < 5; i++ {
var output string
output = <-pipe
fmt.Println("Received", output)
}
stop <- true
}
func main() {
go listen()
go write()
<-stop
}

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先,您的代碼有一個(gè)圍繞stop變量的競賽。當(dāng)發(fā)生數(shù)據(jù)競爭時(shí),無法保證您的程序會(huì)按照定義的那樣運(yùn)行。使用通道來同步 goroutine。然而,這不是您繼續(xù)編程的原因。
您的代碼在 上阻塞fmt.Scanf,無法檢查stop條件。由于無法中斷 Stdin 上的讀取(發(fā)生在 內(nèi)部fmt.Scanf),因此您需要在Scanf再次調(diào)用之前檢查停止條件。如果沒有更多輸入,但您在 Stdin 上有一個(gè)待處理的 Read,處理它的最簡單方法是讓 goroutine 運(yùn)行。有一些相當(dāng)復(fù)雜的方法可以使用稱為“自管道”的技巧來解決這個(gè)問題,但通常不值得付出努力,因?yàn)?goroutine 很小并且不占用太多資源。
for !stop {
fmt.Scanf("%s", &str)
fmt.Println("Entered :", str)
// use a channel to detect when to exit
select {
case <-stop:
return
default:
}
}
- 2 回答
- 0 關(guān)注
- 249 瀏覽
添加回答
舉報(bào)