为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
智慧大石 2022-10-10 16:11:51
我正在为一个项目开发代码生成器,有时需要等待用户输入才能继续。但是,我发现读取用户输入的常用方法不会等待用户输入某些内容,然后再继续运行go generate。但是,如果我以通常的方式运行脚本go run,程序会按预期等待用户输入(尽管这不是我的选择)。我要问的是:有没有办法让程序在运行时挂起并等待用户输入go generate?我已经看到如何从控制台中的标准输入中读取?而且,虽然相关,但这不是完全相同的问题。这是一个示例:main.gopackage mainimport (    "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.gopackage main//go:generate go run main.goRunning go run main.go,循环的单次迭代执行,然后等待我点击返回,然后再进行下一次迭代。运行go generate generate.go时,循环一遍又一遍地迭代而无需等待。您可能会注意到,我真的不需要从用户那里读取任何数据,相反,我只需要从用户那里获得某种反馈,即他们已完成文件更新。如果有另一种方法让程序挂起直到用户完成,那也很好。注意:我也尝试过使用bufio.Reader,fmt.Scanln()和io.ReadAll(os.Stdin)而不是bufio.Scanner但得到相同的结果。
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

go generate generate.goforkmain.go使用 exec.Commandgo 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

}




查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信