首頁  >  文章  >  後端開發  >  如何將擊鍵即時傳送到不換行的頻道?

如何將擊鍵即時傳送到不換行的頻道?

DDD
DDD原創
2024-10-30 07:41:02249瀏覽

How to Send Keystrokes to a Channel Without Newline in Real Time?

將擊鍵發送到不帶換行符的通道

編程中的一個常見需求是將擊鍵從用戶的實時輸入發送到通道-時間。但是,預設情況下,stdin 是行緩衝的,這意味著它需要換行符號才能觸發任何輸入。

您提供的程式碼片段:

func chars() <-chan byte {
    ch := make(chan byte)
    reader := bufio.NewReader(os.Stdin)
    go func() {
        for {
            char, err := reader.ReadByte()
            if err != nil {
                log.Fatal(err)
            }
            ch <- char
        }
    }()
    return ch
}

嘗試實現此目的,但因失敗而失敗標準輸入的行緩衝性質。 reader.ReadByte() 方法將阻塞,直到輸入換行符。

答案中建議的一個解決方案是使用 ncurses,這是一個為終端控制提供一組函數的函式庫。 Ncurses 可讓您將終端配置為切換至非緩衝模式,確保每次按鍵都立即傳送至頻道。

另一個解決方案是使用 go-termbox 包,它提供了更高級別的 API用於處理終端上的輸入和輸出。使用 go-termbox,您可以在讀取使用者輸入之前透過呼叫 SetInputMode(InputEsc) 來實現非緩衝輸入。

對於特定於 Linux 的實現,您可以探索 termios 函式庫或使用 syscall 套件進行直接系統呼叫配置終端行為。應在各自的文件或原始碼中研究每個平台處理緩衝輸入和非緩衝輸入的細節。

以上是如何將擊鍵即時傳送到不換行的頻道?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn