猿问

如何在 go generate 脚本中等待用户输入?

我正在为一个项目开发代码生成器,有时需要等待用户输入才能继续。但是,我发现读取用户输入的常用方法不会等待用户输入某些内容,然后再继续运行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

Running go run main.go,循环的单次迭代执行,然后等待我点击返回,然后再进行下一次迭代。运行go generate generate.go时,循环一遍又一遍地迭代而无需等待。


您可能会注意到,我真的不需要从用户那里读取任何数据,相反,我只需要从用户那里获得某种反馈,即他们已完成文件更新。如果有另一种方法让程序挂起直到用户完成,那也很好。


注意:我也尝试过使用bufio.Reader,fmt.Scanln()和io.ReadAll(os.Stdin)而不是bufio.Scanner但得到相同的结果。


智慧大石
浏览 96回答 1
1回答

12345678_0001

go generate generate.go将forkmain.go使用 exec.Command,go generate没有设置stdinfor main.go,所以main.go无法读取键盘输入os.Stdin。另一种方法是直接从/dev/tty(unix) 或 System API(win) 读取键盘事件:package mainimport (        "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}
随时随地看视频慕课网APP

相关分类

Go
我要回答