我想从命令行读取标准输入,但在提示输入之前,我的尝试已经以程序退出而告终。我正在寻找c#中的Console.ReadLine()的等效。
这是我目前拥有的:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
fmt.Println("Enter text: ")
text2 := ""
fmt.Scanln(text2)
fmt.Println(text2)
ln := ""
fmt.Sscanln("%v", ln)
fmt.Println(ln)
}
总是尽量使用bufio。NewScanner用于从控制台收集输入。正如其他人所提到的,有多种方法可以完成这项工作,但Scanner最初的目的是完成这项工作。Dave Cheney解释了为什么你应该使用Scanner而不是bufio。读者的ReadLine。
https://twitter.com/davecheney/status/604837853344989184?lang=en
下面是回答您的问题的代码片段
package main
import (
"bufio"
"fmt"
"os"
)
/*
Three ways of taking input
1. fmt.Scanln(&input)
2. reader.ReadString()
3. scanner.Scan()
Here we recommend using bufio.NewScanner
*/
func main() {
// To create dynamic array
arr := make([]string, 0)
scanner := bufio.NewScanner(os.Stdin)
for {
fmt.Print("Enter Text: ")
// Scans a line from Stdin(Console)
scanner.Scan()
// Holds the string that scanned
text := scanner.Text()
if len(text) != 0 {
fmt.Println(text)
arr = append(arr, text)
} else {
break
}
}
// Use collected inputs
fmt.Println(arr)
}
如果您不想以编程方式收集输入,只需添加这些行
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
text := scanner.Text()
fmt.Println(text)
以上程序的输出为:
Enter Text: Bob
Bob
Enter Text: Alice
Alice
Enter Text:
[Bob Alice]
上面的程序收集用户输入并将它们保存到一个数组中。我们也可以用一个特殊的角色打破这种流程。Scanner为高级用途提供API,如使用自定义函数进行分割等,扫描不同类型的I/O流(标准Stdin, String)等。
编辑:原始帖子中链接的推文无法访问。但是,您可以从这个标准库文档中找到使用Scanner的官方参考:https://pkg.go.dev/bufio@go1.17.6#example-Scanner-Lines