Editor PHP Apple akan memperkenalkan anda kepada nota penting dalam artikel ini: "Jangan terima input berulang daripada stdin". Dalam pengaturcaraan, kami sering menggunakan stdin sebagai sumber input, tetapi input berulang mungkin menyebabkan ralat atau tingkah laku yang tidak dapat diramalkan dalam atur cara. Oleh itu, kita perlu memberi perhatian untuk mengelakkan pertindihan input apabila menggunakan stdin untuk memastikan operasi normal program. Dalam artikel berikut, kami akan meneroka masalah ini secara terperinci dan menyediakan beberapa penyelesaian serta cadangan praktikal untuk membantu pembaca mengendalikan situasi pendua input stdin dengan lebih baik.
Saya mempunyai program rekaan yang matlamatnya adalah untuk menggemakan teks pada input standard (berapa kali yang diperlukan) dan keluar selepas 10 saat. Kodnya adalah seperti berikut:
package main import ( "bufio" "fmt" "os" "time" ) func main() { input := make(chan string) abort := make(chan bool) // exit after 10 sec go func() { time.Sleep(10 * time.Second) abort <- true }() go func() { cmd := bufio.NewScanner(os.Stdin) for cmd.Scan() { input <- "<- " + cmd.Text() } }() select { case <-abort: fmt.Println("exiting") return case cmd := <-input: fmt.Println(cmd) } }
Masalahnya ialah apabila saya memasukkan baris pertama teks, ia bergema kepada stdout dan program keluar. Saya mahu memasukkan seberapa banyak arahan yang mungkin dalam 10 saat.
Apa salah saya?
Saluran abort ditutup selepas 10 saat, yang membolehkan kes pemilihan pertama (<-abort) dicetuskan dan keluar dari program. Ini yang saya dapat
func main() { input := make(chan string) abort := make(chan bool) // exit after 10 sec go func() { time.Sleep(10 * time.Second) close(abort) // Close the channel after 10 seconds }() go func() { cmd := bufio.NewScanner(os.Stdin) for cmd.Scan() { input <- "<- " + cmd.Text() } }() for { select { case <-abort: fmt.Println("closing connection") return case cmd := <-input: fmt.Println(cmd) } } }'
Saya menggunakan "untuk" untuk menggantikan pernyataan pilihan luar dengan gelung tak terhingga Selepas tamat masa 10 saat, saya menutup saluran batal menggunakan pernyataan tutup(abort). Ini memberitahu pernyataan pilih bahawa tamat masa telah berlaku dan pelaksanaan kes pertama (<-abort) harus diteruskan apabila saluran ditutup. Saya mempunyai taip sezier jadi saya harap anda faham.
Atas ialah kandungan terperinci Jangan terima input pendua daripada stdin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!