問題:
問題:package main import ( "bufio" "fmt" "os" ) func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } print(file1chan) } func print(in <-chan string) { for str := range in { fmt.Printf("%s\n", str) } }您有一個包含一行單字的文字文件,並且您正在嘗試將每個單字儲存在一個通道中。隨後,您希望從通道中檢索這些單字並一次列印一個。以下程式碼片段代表您目前的方法:
但是,在運行此程式碼時,您會遇到錯誤訊息:「致命錯誤:所有goroutine 都在睡眠- 死鎖!」
解:出現錯誤是因為你的file1chan是一個無緩衝的通道。當您嘗試沿著此通道發送值時,它會無限期地阻塞,等待接收者。要解決此死鎖,您可以啟動一個新的 goroutine 負責將值傳送到通道中,或將通道宣告為緩衝通道。以下概述了兩種方法:
package main import ( "bufio" "fmt" "os" ) func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) // Start a new goroutine to send strings down file1chan go func() { for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) // Close the channel when done sending. }() print(file1chan) // Read strings from file1chan } func print(in <-chan string) { for str := range in { fmt.Printf("%s\n", str) } }
使用新Goroutine:
使用緩衝通道:package main import ( "bufio" "fmt" "os" ) func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) // Buffer size of one for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) // Close the channel when done sending. print(file1chan) } func print(in <-chan string) { for str := range in { // Read all values until channel gets closed fmt.Printf("%s\n", str) } }For處理單一字串,您可以定義大小的緩衝通道1:
以上是Go中使用無緩衝通道時如何解決'致命錯誤:所有 Goroutine 都處於睡眠狀態 - 死鎖!”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!