問題:
1 行の単語が含まれるテキスト ファイルがあります。各単語をチャネルに保存しようとします。次に、これらの単語をチャネルから取得し、一度に 1 つずつ出力します。次のコード スニペットは現在のアプローチを表しています:
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) } }
ただし、このコードを実行すると、次のエラー メッセージが表示されます:「致命的なエラー: すべてのゴルーチンがスリープ状態です - デッドロック!」
解決策:
file1chan がバッファリングされていないチャネルであるためにエラーが発生します。このチャネルに値を送信しようとすると、無限にブロックされ、受信者を待ちます。このデッドロックを解決するには、チャネルに値を送信する新しいゴルーチンを開始するか、チャネルをバッファリング済みとして宣言します。以下に 2 つのアプローチの概要を示します。
新しい 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) } }
バッファリングされたチャネルの使用:
単一の文字列を処理する場合、次のサイズのバッファリングされたチャネルを定義できます。 1:
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) } }
以上がバッファリングされていないチャネルを使用しているときに Go で「致命的エラー: すべてのゴルーチンがスリープ中 - デッドロック!」を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。