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教程。
