editor php Yuzai mendapati semasa menjalankan ujian interaktif, kadangkala masalah akan dihadapi. Salah satu masalah biasa ialah apabila berinteraksi menggunakan antara muka baris arahan (CLI), pengimbas mungkin tidak menunggu input pengguna. Ini bermakna apabila pengguna digesa untuk input, program meneruskan pelaksanaan serta-merta tanpa menunggu respons pengguna. Ini boleh menyebabkan program ralat atau tidak dilaksanakan dengan betul. Penyelesaian kepada masalah ini adalah dengan menggunakan teknik atau kaedah yang sesuai untuk memastikan pengimbas menunggu input pengguna untuk memastikan ujian interaksi lancar.
Saya cuba menulis ujian untuk mengesahkan gesaan cli, mensimulasikan input pengguna sebagai tindak balas kepada beberapa output program.
Bagaimana untuk membuat scanner.scan
menunggu penulisan yang lain?
Apa yang saya ada setakat ini:
b := &bytes.buffer{} fmt.fprint(b, "0") go func() { time.sleep(1 * time.second) for i := 1; i < 4; i++ { fmt.fprint(b, i) time.sleep(1 * time.second) } }() scanner := bufio.newscanner(b) for scanner.scan() { log.print(scanner.text()) } if err := scanner.err(); err != nil { log.println("problem while scanning:", err) }
Hasil yang diharapkan ialah: 0123
Hasil sebenar ialah: 0
Saya mencuba versi io.pipe
r, w := io.Pipe() fmt.Fprint(w, "0") go func() { time.Sleep(1 * time.Second) for i := 1; i < 4; i++ { fmt.Fprint(w, i) time.Sleep(1 * time.Second) } }() scanner := bufio.NewScanner(r) for scanner.Scan() { log.Print(scanner.Text()) } if err := scanner.Err(); err != nil { log.Println("problem while scanning:", err) }
Keputusan: Ralat maut: semua goroutine sedang tidur - kebuntuan!
Apabila menggunakan paip, menulis dan membaca adalah serentak. Tanpa bacaan yang sepadan, penulisan tidak dapat diselesaikan. Alihkan tulisan pertama ke goroutine. Dan tutup hujung tulis paip supaya pengimbas berhenti mengimbas.
r, w := io.Pipe() go func() { defer w.Close() fmt.Fprint(w, "0") time.Sleep(1 * time.Second) for i := 1; i < 4; i++ { fmt.Fprint(w, i) time.Sleep(1 * time.Second) } }() scanner := bufio.NewScanner(r) for scanner.Scan() { log.Print(scanner.Text()) } if err := scanner.Err(); err != nil { log.Println("problem while scanning:", err) }
Atas ialah kandungan terperinci Masalah semasa menguji gesaan cli secara interaktif, pengimbas tidak menunggu input pengguna. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!