Go 读取输入
最后修改时间 2024 年 4 月 11 日
在本文中,我们将介绍如何从用户那里读取输入。标准输入,通常缩写为 *stdin*,是一个程序从中读取其输入数据的流。
为了在 Go 中从用户读取输入,我们使用 fmt、bufio 和 os 包。
使用 Scanf 读取 Go 输入
Scanf 函数扫描从标准输入读取的文本,根据格式将连续的空格分隔的值存储到连续的参数中。它返回成功扫描的项目数。
package main
import "fmt"
func main() {
var name string
fmt.Print("Enter your name: ")
fmt.Scanf("%s", &name)
fmt.Println("Hello", name)
}
该示例提示用户输入其姓名。
var name string
我们定义一个字符串变量。
fmt.Scanf("%s", &name)
输入的值存储在 name 变量中。
$ go run read_input.go Enter your name: Peter Hello Peter
我们运行程序并输入一个姓名。
在下一个示例中,我们读取两个值。
package main
import "fmt"
func main() {
var name string
var age int
fmt.Print("Enter your name & age: ")
fmt.Scanf("%s %d", &name, &age)
fmt.Printf("%s is %d years old\n", name, age)
}
该程序从用户那里读取姓名和年龄。
fmt.Scanf("%s %d", &name, &age)
Scanf 函数将字符串和整数读取到两个提供的变量中。
$ go run read_input2.go Enter your name & age: Peter 34 Peter is 34 years old
使用 NewReader 读取 Go 输入
bufio 包实现了缓冲 I/O。缓冲 I/O 的性能远优于非缓冲 I/O。该包包装了一个 io.Reader 或 io.Writer 对象,创建另一个对象(Reader 或 Writer),该对象也实现了接口,但提供了缓冲和一些用于文本 I/O 的帮助。
package main
import (
"os"
"bufio"
"fmt"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter your name: ")
name, _ := reader.ReadString('\n')
fmt.Printf("Hello %s\n", name)
}
该程序使用 bufio.NewReader 从输入中读取姓名。
reader := bufio.NewReader(os.Stdin)
我们将标准输入传递给 bufio.NewReader。
name, _ := reader.ReadString('\n')
ReadString 读取直到输入中第一次出现指定的分隔符(在本例中为换行符),返回一个包含分隔符之前(包括分隔符)数据的字符串。
使用 NewScanner 读取 Go 输入
Scanner 提供了一个方便的接口,用于读取数据,例如逐行文本文件。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
names := make([]string, 0)
scanner := bufio.NewScanner(os.Stdin)
for {
fmt.Print("Enter name: ")
scanner.Scan()
text := scanner.Text()
if len(text) != 0 {
fmt.Println(text)
names = append(names, text)
} else {
break
}
}
fmt.Println(names)
}
该示例允许从用户那里读取多个姓名。按 Enter 键不输入值以结束程序。
names := make([]string, 0)
我们创建一个空切片。
scanner := bufio.NewScanner(os.Stdin)
从标准输入创建一个新的扫描器。
for {
fmt.Print("Enter name: ")
...
在 for 循环中,我们反复要求用户输入姓名。
scanner.Scan()
我们从标准输入读取一行。Scan 将扫描器前进到下一个标记,该标记随后可通过 Bytes 或 Text 函数访问。
text := scanner.Text()
Text 以新分配的字符串的形式返回由 Scan 调用生成的最新标记。
if len(text) != 0 {
fmt.Println(text)
names = append(names, text)
} else {
break
}
如果文本不为空,我们将其打印并附加到切片中。
fmt.Println(names)
最后,我们打印所有扫描到的姓名。
$ go run read_input3.go Enter name: Lucia Lucia Enter name: Peter Peter Enter name: Roman Roman Enter name: Jane Jane Enter name: [Lucia Peter Roman Jane]
来源
在本文中,我们介绍了在 Golang 中从用户读取输入的方法。