首頁 > 後端開發 > Golang > 主體

不接受 stdin 的重複輸入

WBOY
發布: 2024-02-08 22:50:09
轉載
1037 人瀏覽過

不接受来自 stdin 的重复输入

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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!