⌨️在Go中读取用户输入的信息的方法介绍

226 阅读4分钟

要从Go的终端控制台读取用户的输入,你可以使用几种方法:

像往常一样,使用哪种方法取决于用例。在接下来的章节中,我们将展示如何从控制台读取单行或多行的用户输入,如何读取单个字符,如何从格式化输入中读取数据,最后是如何从终端读取数字。

从标准输入读取单行

使用 fmt.Scanln()来读取单行文本

package main
import (
"fmt"
"log"
)
func main() {
fmt.Println("input text:")
var w1, w2, w3 string
n, err := fmt.Scanln(&w1, &w2, &w3)
if err != nil {
log.Fatal(err)
}
fmt.Printf("number of items read: %d\n", n)
fmt.Printf("read line: %s %s %s-\n", w1, w2, w3)
}

输出:

input text:
ab cd ef
number of items read: 3
read line: ab cd ef-

使用 bufio.Reader读取单行文本

package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
fmt.Println("input text:")
reader := bufio.NewReader(os.Stdin)
line, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
fmt.Printf("read line: %s-\n", line)
}

输出:

input text:
ab cd ef
read line: ab cd ef
-

使用 bufio.Scanner读取单行文本

package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
fmt.Println("input text:")
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
err := scanner.Err()
if err != nil {
log.Fatal(err)
}
fmt.Printf("read line: %s-\n", scanner.Text())
}

输出:

input text:
ab cd ef
number of items read: 3
read line: ab cd ef-
  • 如果你想读取每一个字,请使用 fmt.Scanln()函数,如果你想把一行的每个字都读到不同的变量中,并且有一定数量的字要读,不能少,也不能多。
  • 使用 bufio.Reader如果你想把一整行的文字和换行符一起读出来。
  • 使用 bufio.Scanner以方便的方式读取整行的文字,而不使用换行符。

从控制台读取多行

使用 fmt.Scan()读取多行文本

package main
import (
"fmt"
"log"
)
func main() {
fmt.Println("input text:")
var w1, w2, w3 string
n, err := fmt.Scan(&w1, &w2, &w3)
if err != nil {
log.Fatal(err)
}
fmt.Printf("number of items read: %d\n", n)
fmt.Printf("read text: %s %s %s-\n", w1, w2, w3)
}

输出:

input text:
ab
cd
ef
number of items read: 3
read text: ab cd ef-

fmt.Scan()你可以读取多行文本,但前提是这一行由一个字组成。

使用 bufio.Reader读取多行文本

package main
import (
"bufio"
"fmt"
"log"
"os"
"strings"
)
func main() {
fmt.Println("input text:")
reader := bufio.NewReader(os.Stdin)
var lines []string
for {
line, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
if len(strings.TrimSpace(line)) == 0 {
break
}
lines = append(lines, line)
}
fmt.Println("output:")
for _, l := range lines {
fmt.Println(l)
}
}

输出:

input text:
ab cd ef gh
hj kl mn op
output:
ab cd ef gh
hj kl mn op

使用 bufio.Scanner读取多行文本

package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
fmt.Println("input text:")
scanner := bufio.NewScanner(os.Stdin)
var lines []string
for {
scanner.Scan()
line := scanner.Text()
if len(line) == 0 {
break
}
lines = append(lines, line)
}
err := scanner.Err()
if err != nil {
log.Fatal(err)
}
fmt.Println("output:")
for _, l := range lines {
fmt.Println(l)
}
}

输出:

input text:
ab cd ef gh
hj kl mn op
output:
ab cd ef gh
hj kl mn op
  • 使用 fmt.Scan()如果你想阅读多个单词,每个单词都在一个单独的行上。
  • 使用 bufio.Reader如果你想把多行文字放在一起阅读,并在每行的末尾加上换行符。
  • 最值得推荐和通用的阅读多行的方法是使用 bufio.Scanner,它可以让你得到一个没有每行末尾换行符的输入行列表。

从终端读取单个字符

使用 bufio.Reader读取单个字符

package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
fmt.Println("input text:")
reader := bufio.NewReader(os.Stdin)
char, _, err := reader.ReadRune()
if err != nil {
log.Fatal(err)
}
fmt.Printf("read character: %c-\n", char)
}

输出:

input text:
abfd
read character: a-

使用 fmt.Scanf()读取单个字符

package main
import (
"fmt"
"log"
)
func main() {
fmt.Println("input text:")
var char rune
_, err := fmt.Scanf("%c", &char)
if err != nil {
log.Fatal(err)
}
fmt.Printf("read character: %c-\n", char)
}

输出:

input text:
abcd
read character: a-
  • 读取单个字符可以通过 bufio.Reader和它的 ReadRune()方法,它返回符文、符文的大小和阅读错误。
  • 一个稍微简单的单行读取字符的方法是使用 fmt.Scanf()函数与%c

读取格式化的用户输入

当你想只接受特定格式的文本并将某些项目读入变量时,最好的方法是使用 fmt.Scanf()函数,它根据给定的格式读取文本。

package main
import (
"fmt"
"log"
)
func main() {
fmt.Println("input text:")
var name string
var country string
n, err := fmt.Scanf("%s is born in %s", &name, &country)
if err != nil {
log.Fatal(err)
}
fmt.Printf("number of items read: %d\n", n)
fmt.Println(name, country)
}
input text:
Anna is born in Germany
number of items read: 2
Anna Germany

从用户输入中读取数字

从终端控制台读取数字可以通过使用 fmt.Scanf()fmt.Scan()函数来完成。第一个函数需要一个输入格式--对于数字,整数是%d ,浮点数是%f 。第二个函数更简单,它不需要格式,而是自己发现输入数据应该如何解析以匹配输出变量。

使用 fmt.Scanf()读取一个数字

package main
import (
"fmt"
"log"
)
func main() {
fmt.Println("input number:")
var number int64
_, err := fmt.Scanf("%d", &number)
if err != nil {
log.Fatal(err)
}
fmt.Printf("read number: %d\n", number)
}

输出:

input number:
8
read number: 8

使用 fmt.Scan()读取一个数字

package main
import (
"fmt"
"log"
)
func main() {
fmt.Println("input number:")
var number int64
_, err := fmt.Scan(&number)
if err != nil {
log.Fatal(err)
}
fmt.Printf("read number: %d\n", number)
}

输出:

input number:
8
read number: 8