Goreadinput教程展示了如何读取用户的输入。标准输入,通常缩写为stdin,是程序从中读取其输入数据的流。
为了在Go中读取用户的输入,我们使用fmt
、bufio
和os
包。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
使用Scanf读取输入
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读取输入
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读取输入
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
将Scanner推进到下一个令牌,然后可通过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中读取用户输入的方法。
列出所有Go教程。