我正在構建一個過濾管道,通過函陣列合而不是 120 LOC 全部在一個方法中使用通道,因為我以后可能會重用這個管道的某些部分。
我無法讓它按預期作業。我懷疑函式在將值放入通道readValuesFromFile
之前退出(即該方法的主 goroutine 在 (1) goroutine 之前退出)。scanner.Scan()inputStream
如果我scanner.Scan()只在通道中放置一些隨機字串來替換,整個管道就會按預期作業。
這是問題還是我遺漏了什么?
如何以優雅的方式解決這個問題?
謝謝!
func readValuesFromFile(filename string) <-chan string {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer file.Close()
inputStream := make(chan string)
go func() { //(1)
count := 0
scanner := bufio.NewScanner(file)
for scanner.Scan() { // (2)
inputStream <- strings.TrimSpace(scanner.Text())
count = count 1
}
close(inputStream)
}()
return inputStream
}
func validateValues(inputStream <-chan string) <-chan string {
//read from the input stream validate&filter creating and putting values in an output stream
}
func writeResults(validStream <-chan string) {
//read from the validated stream and write data to file
}
func main() {
valueStream := readValuesFromFile("myfile.txt")
validatedStream := validateValues(valueStream)
writeResults(validatedStream)
}
uj5u.com熱心網友回復:
該函式readValuesFromFile保證在第一個值發送到 之前回傳inputStream。在inputStream發送方和接收方準備就緒之前,無緩沖通道上的通信不會成功。inputStream在readValuesFromFile回傳之前沒有接收,因此在回傳之后來自 goroutine 的發送將不會成功readValuesFromFile。
當函式readValuesFromFile回傳時,defer 陳述句關閉掃描器使用的檔案。掃描儀可能在檔案關閉之前緩沖了一些資料,但也有可能掃描儀沒有讀取任何資料。
通過從 goroutine 關閉檔案來修復。
掃描儀回傳的錯誤描述了問題。總是處理錯誤。
func readValuesFromFile(filename string) <-chan string {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
inputStream := make(chan string)
go func() {
defer file.Close()
defer close(inputStream)
count := 0
scanner := bufio.NewScanner(file)
for scanner.Scan() {
inputStream <- strings.TrimSpace(scanner.Text())
count = count 1
}
if scanner.Err() != nil {
// Handle error as appropriate for your application.
log.Print("scan error", err)
}
}()
return inputStream
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358301.html
