编写命令行程序时,可以使用任何接受io.Reader的函数从os.Stdin中读取用户输入。
fmt.Scanf从stdio读取
最方便的方法是使用fmt.Scanf,它是fmt.Printf的镜像。
这是从控制台(标准输入)读取字符串和整数的方法
fmt.Print("What is your name?\n")
var name string
if n, err := fmt.Scanf("%s", &name); err != nil {
fmt.Printf("fmt.Scanf failed with '%s'\n", err)
} else {
fmt.Printf("fmt.Scanf scanned %d item(s) and set name to '%s'\n", n, name)
}
fmt.Print("What is your age?\n")
var age int
if n, err := fmt.Scanf("%d", &age); err != nil {
fmt.Printf("fmt.Scanf failed with '%s'\n", err)
} else {
fmt.Printf("fmt.Scanf scanned %d item(s) and set age to '%d'\n", n, age)
}
fmt.Scanf从os.Stdin读取输入,并尝试根据提供的格式设置传递的变量。
空格和换行符被视为值分隔符。
它返回成功解析的数量(防止仅匹配前几个变量)
要从任意io.Reader中读取,请使用fmt.Fscanf。
fmt.Scanln从stdin读取一行
要读取整行(直到换行符或io.EOF,请使用fmt.Scanln:
var line string
fmt.Scanln(&line)
fmt.Printf("Entered line: '%s'\n", line)
bufio.Reader从stdin读取一行
您也可以使用bufio.Reader:
reader := bufio.NewReader(os.Stdin)
if line, err := reader.ReadString('\n'); err != nil {
fmt.Printf("ReadString failed with '%s'\n", err)
} else {
fmt.Printf("Entered line: '%s'\n", line)
}
ReadString从读取器读取,直到读取给定字符。 我们指定了换行符\n,因此它将读取整行。
ReadString返回的值包含终止字符(\n),因此通常您希望使用例如。 strings.TrimSpace。
字符\n是Unix上的行终止符。 在Windows上更常见的是将\r\n视为行终止符。 如果希望在Windows上运行,请确保进行处理(例如,通过从返回的字符串中修剪\r字符)。
bufio.Scanner从stdin读取一行
也可以使用bufio.Scanner从stdin读取行
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := scanner.Text()
fmt.Printf("Entered line: '%s'\n", line)
}
bufio.Scanner允许使用更复杂的用法,您可以指定使用Scanner.Split将输入拆分成块的函数。