ZetCode

Go 读取输入

最后修改时间 2024 年 4 月 11 日

在本文中,我们将介绍如何从用户那里读取输入。标准输入,通常缩写为 *stdin*,是一个程序从中读取其输入数据的流。

为了在 Go 中从用户读取输入,我们使用 fmtbufioos 包。

使用 Scanf 读取 Go 输入

Scanf 函数扫描从标准输入读取的文本,根据格式将连续的空格分隔的值存储到连续的参数中。它返回成功扫描的项目数。

read_input.go
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

我们运行程序并输入一个姓名。

在下一个示例中,我们读取两个值。

read_input2.go
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.Readerio.Writer 对象,创建另一个对象(Reader 或 Writer),该对象也实现了接口,但提供了缓冲和一些用于文本 I/O 的帮助。

read_input3.go
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 提供了一个方便的接口,用于读取数据,例如逐行文本文件。

read_input4.go
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 将扫描器前进到下一个标记,该标记随后可通过 BytesText 函数访问。

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]

来源

Go bufio 包 - 参考

在本文中,我们介绍了在 Golang 中从用户读取输入的方法。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十年以上的经验。

列出所有 Go 教程