我正在尝试编写一个函数,该函数可以从键盘读取输入或从管道输入的文件中一次一行读取。我已经有一个类似于prompt()此测试代码的键盘输入函数:
package main
import (
"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 bill
soft, 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每次都创建一个新的,但我想知道是否有更好的方法来做到这一点而不必求助于全局变量。
阿波罗的战车
相关分类