• Go

Go 控制台输入

编写命令行程序时,可以使用任何接受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将输入拆分成块的函数。


相关

最新