我想寫一個函數,可以從鍵盤讀取輸入或從一個管道輸入文件一次讀取一行。我已經有一個函數,它類似於鍵盤輸入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!
據我瞭解,這是因爲在greet()
中製作的bufio.Scanner
讀取了全部a.txt
。通過將bufio.Scanner
設置爲全局變量,我可以很容易地解決這個問題,並且每次都使用prompt()
而不是創建一個新的bufio.Scanner
,但我想知道是否有更好的方法來做到這一點,而不必訴諸於全局變量。