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

go - 键盘或管道文件输入

go - 键盘或管道文件输入

Go
哆啦的时光机 2021-07-03 06:12:37
我正在尝试编写一个函数,该函数可以从键盘读取输入或从管道输入的文件中一次一行读取。我已经有一个类似于prompt()此测试代码的键盘输入函数:package mainimport (    "fmt"    "bufio"    "os")func print(format string, a ...interface{}) {    fmt.Printf(format+"\n", a...)}func prompt(format string) string {    fmt.Print(format)    in := bufio.NewScanner(os.Stdin)    in.Scan()    return in.Text()}func greet() {    name := prompt("enter name: ")    print(`Hello %s!`, name)}func humor() {    color := prompt("enter favorite color: ")    print(`I like %s too!`, color)}func main() {    greet()    humor()}在这里,greet()并且humor()都使用prompt()以获取输入,如果我在答复运行程序和类型,预期它会工作。但是,如果我有一个文件a.txt:bobby billsoft, blue-ish turquoise然后运行:.\test< a.txt,程序会输出:enter name: Hello bobby bill!enter favorite color: I like  too!代替:enter name: Hello bobby bill!enter favorite color: I like soft, blue-ish turquoise too!据我了解,这是因为bufio.Scanner在greet()read all of a.txt. 我可以通过创建bufio.Scanner一个全局变量来轻松解决这个问题,并prompt()使用它而不是bufio.Scanner每次都创建一个新的,但我想知道是否有更好的方法来做到这一点而不必求助于全局变量。
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

您的分析是正确的,问题在于bufio.Scanner缓冲的不仅仅是一行文本,因此当您将其丢弃时,您会丢失该输入。如果您打算使用缓冲输入,您应该确保所有内容都使用相同的缓冲区以避免此类问题。

使用全局变量是一种解决方案。另一种方法是创建一个类型来保存bufio.Scanner并将您的一些函数转换为方法。


查看完整回答
反对 回复 2021-07-05
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

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