php小編蘋果在這篇文章中將向大家介紹一個重要的注意事項:「不接受來自 stdin 的重複輸入」。在程式設計中,我們經常使用stdin作為輸入來源,但是重複的輸入可能會導致程式出現錯誤或不可預測的行為。因此,我們需要注意在使用stdin時避免輸入的重複,以確保程式的正常運作。在接下來的文章中,我們將詳細探討這個問題,並提供一些解決方案和實務建議,幫助讀者更好地處理stdin輸入的重複情況。
我有一個人為的程序,其目標是在標準輸入上回顯文字(根據需要多次),並在 10 秒後退出。程式碼如下:
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) } }
問題是當我輸入第一行文字時,它會回顯到標準輸出並且程式退出。我想在 10 秒內輸入盡可能多的命令。
我做錯了什麼?
中止通道在 10 秒後關閉,這使得第一個選擇案例 (<-abort) 被觸發並退出程式。這是我得到的
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) } } }'
我使用「for」將外部 select 語句替換為無限循環 10 秒逾時後,我使用 close(abort) 語句關閉中止通道。這將告訴 select 語句已發生逾時,並且當通道關閉時應繼續執行第一種情況 (<-abort)。我有一個 sezier 打字,所以我希望你能明白。
以上是不接受 stdin 的重複輸入的詳細內容。更多資訊請關注PHP中文網其他相關文章!