第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在不進(jìn)入 Golang 循環(huán)的情況下捕獲按鍵

如何在不進(jìn)入 Golang 循環(huán)的情況下捕獲按鍵

Go
holdtom 2023-06-05 09:46:59
我有一個(gè)循環(huán),其中一些事情根據(jù)它運(yùn)行的狀態(tài)(手動(dòng)/自動(dòng)/學(xué)習(xí))發(fā)生。我現(xiàn)在希望能夠通過(guò)按鍵盤上的伴隨字母(“m”代表手動(dòng),“a”代表自動(dòng),“l(fā)”代表學(xué)習(xí))讓程序在這些狀態(tài)之間切換。所以要做到這一點(diǎn),我需要能夠在循環(huán)期間捕捉到按鍵并相應(yīng)地更改變量狀態(tài)。我現(xiàn)在有以下內(nèi)容,它可以捕捉到一個(gè)按鍵,然后是一個(gè)輸入:ch := make(chan string)go func(ch chan string) {    reader := bufio.NewReader(os.Stdin)    for {        s, _ := reader.ReadString('\n')        ch <- s    }}(ch)for {    select {        case stdin, _ := <-ch:            fmt.Println("Keys pressed:", stdin)        default:            fmt.Println("Working..")    }    time.Sleep(time.Second)}但我需要按下回車鍵這一事實(shí)是不可接受的。有沒(méi)有人知道一種非阻塞的方式來(lái)捕獲普通字母(不是 SIGINT)的按鍵而無(wú)需事后按回車鍵?
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊

在閱讀 os.Stdin.Read() 并找到這個(gè)答案后,我創(chuàng)建了以下代碼:


package main


import (

? ? "fmt"

? ? "os"

? ? "time"

? ? "os/exec"

)


func main() {

? ? ch := make(chan string)

? ? go func(ch chan string) {

? ? ? ? // disable input buffering

? ? ? ? exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()

? ? ? ? // do not display entered characters on the screen

? ? ? ? exec.Command("stty", "-F", "/dev/tty", "-echo").Run()

? ? ? ? var b []byte = make([]byte, 1)

? ? ? ? for {

? ? ? ? ? ? os.Stdin.Read(b)

? ? ? ? ? ? ch <- string(b)

? ? ? ? }

? ? }(ch)


? ? for {

? ? ? ? select {

? ? ? ? ? ? case stdin, _ := <-ch:

? ? ? ? ? ? ? ? fmt.Println("Keys pressed:", stdin)

? ? ? ? ? ? default:

? ? ? ? ? ? ? ? fmt.Println("Working..")

? ? ? ? }

? ? ? ? time.Sleep(time.Millisecond * 100)

? ? }

}

這就像一個(gè)魅力。


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
躍然一笑

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊

因?yàn)槟阏谑褂?code>ReadStringwhich 期望你給它的任何參數(shù),在你的情況下 - 關(guān)鍵return。根據(jù)文檔:

ReadString 一直讀取到輸入中第一次出現(xiàn) delim,返回一個(gè)包含數(shù)據(jù)的字符串,直到并包括分隔符。

這意味著在您按下該鍵之前,該方法不會(huì)返回return。

您可以改用常規(guī)的Read方法來(lái)讀取您需要的字符。


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
江戶川亂折騰

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊

如果你想檢查是否按下了某個(gè)鍵而不阻塞它所在的進(jìn)程,你應(yīng)該使用這樣的東西:


import (

   ...

   "golang.org/x/sys/windows"

)


var user32_dll  = windows.NewLazyDLL("user32.dll")

var GetKeyState = user32_dll.NewProc("GetKeyState")


func wasESCKeyPressed() bool {

    r1, _, _ := GetKeyState.Call(27) // Call API to get ESC key state.

    return r1 == 65409               // Code for KEY_UP event of ESC key.

}


func loop() {

    for {

       // Do something...

       if wasESCKeyPressed() {

           break

       }

       // Do something...

       time.Sleep(time.Millisecond * 10)

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-06-05
  • 3 回答
  • 0 關(guān)注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)