我正在為一個專案開發代碼生成器,有時需要等待用戶輸入才能繼續。但是,我發現讀取用戶輸入的常用方法在 run through 時不會等待用戶輸入內容后再繼續go generate。但是,如果我以通常的go run方式運行腳本,程式會按預期等待用戶輸入(但這對我來說不是一個選項)。
我要問的是:有沒有辦法讓程式在運行時掛起并等待用戶輸入go generate?
我已經看到如何從控制臺中的標準輸入讀取?而且,雖然相關,但這不是完全相同的問題。
這是一個示例:
main.go
package main
import (
"bufio"
"log"
"os"
)
func main() {
for isFileOk := checkFile(); !isFileOk; {
log.Println("File requires manual update.")
log.Println("Hit [RETURN] when resolved.")
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
break
}
isFileOk = checkFile()
}
}
func checkFile() bool {
return false
}
generate.go
package main
//go:generate go run main.go
運行go run main.go,回圈的單次迭代執行,然后在移動到下一次迭代之前等待我點擊回傳。運行時go generate generate.go,回圈會一遍又一遍地迭代而無需等待。
您可能會注意到,我實際上并不需要從用戶那里讀取任何資料,相反,我只需要從用戶那里獲得某種反饋,表明他們已完成更新檔案。如果有另一種方法讓程式掛起直到用戶完成,那也很好。
注意:我也試過使用bufio.Reader, fmt.Scanln(), andio.ReadAll(os.Stdin)而不是bufio.Scanner但得到相同的結果。
uj5u.com熱心網友回復:
go generate generate.go會forkmain.go使用 exec.Command,go generate沒有設定stdinfor main.go,所以main.go無法讀取鍵盤輸入os.Stdin。
另一種方法是直接從/dev/tty(unix) 或 System API(win)讀取鍵盤事件:
package main
import (
"fmt"
"log"
"github.com/eiannone/keyboard"
)
func main() {
if err := keyboard.Open(); err != nil {
panic(err)
}
defer func() {
_ = keyboard.Close()
}()
for isFileOk := checkFile(); !isFileOk; {
log.Println("File requires manual update.")
log.Println("Hit [RETURN] when resolved.")
char, key, err := keyboard.GetKey()
if err != nil {
panic(err)
}
fmt.Println(char, key, err)
if key == keyboard.KeyEsc {
return
}
}
}
func checkFile() bool {
return false
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338482.html
