Masalah:
Anda mempunyai fail teks dengan satu baris perkataan dan anda cuba menyimpan setiap perkataan dalam saluran. Selepas itu, anda ingin mendapatkan semula perkataan ini daripada saluran dan mencetaknya satu demi satu. Coretan kod berikut mewakili pendekatan semasa anda:
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) } }
Walau bagaimanapun, semasa menjalankan kod ini, anda menemui mesej ralat: "ralat maut: semua gorouti sedang tidur - kebuntuan!"
Penyelesaian:
Ralat timbul kerana file1chan anda ialah saluran yang tidak dibuffer. Apabila anda cuba menghantar nilai ke saluran ini, saluran ini disekat selama-lamanya, menunggu penerima. Untuk menyelesaikan kebuntuan ini, anda boleh sama ada memulakan goroutine baharu yang bertanggungjawab untuk menghantar nilai ke saluran atau mengisytiharkan saluran sebagai penimbal. Dua pendekatan digariskan di bawah:
Menggunakan Goroutine Baharu:
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) } }
Menggunakan Saluran Buffer:
Untuk mengendalikan rentetan tunggal, anda boleh menentukan saluran penimbal bersaiz 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) } }
Atas ialah kandungan terperinci Cara Menyelesaikan \'Ralat Maut: Semua Goroutine Tidur - Kebuntuan!\' dalam Pergi Apabila Menggunakan Saluran Tidak Dibuffer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!