学习 Golang扫描、Scanln和Scanf
命令行接口
当构建在终端上运行的程序时,能够让用户输入文本往往是很有用的。
例如,ssh-keygen 工具会提示输入路径和口令:
❯ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/fernando/.ssh/id_rsa): /tmp/test_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Scan
fmt 包的Scan 方法将从标准输入设备(通常是控制台)中读取一个用空格分隔的标记(如一个字)。
Scan 该方法期望一个地址作为其参数。这可以通过在变量名前使用 符号来提供。&
比如说:
package main
import (
"fmt"
)
func main() {
fmt.Print("What is your first name? ")
var response string
fmt.Scan(&response)
fmt.Printf("Hello, %v!\n", response)
}
这个程序在执行时,将等待用户输入一行文字,然后它将取该行的第一个字(直到它找到一个空格或行的末端):
❯ go run ./scanning/scan.go
What is your first name? Jane
Hello, Jane!
如果输入一个以上的字,只有第一个字会被Scan 。其余的留在控制台,可由另一个Scan 调用读取。比如说:
❯ go run ./scanning/scan.go
What is your first name? Jane Doe
Hello, Jane!
❯ Doe
zsh: Doe: command not found...
注意其余的输入被留在控制台,并在程序完成后由终端读取。
Scanln
Scanln 方法与Scan 相似。它也会读取空间分隔的标记。两个不同之处是:
- 它将在换行符处停止。
- 它要求在最后一个项目后有一个换行符或EOF字符。
Scanf
根据文档的内容:
Scanf 扫描从标准输入读取的文本,将连续的空格分隔的值存储到由格式决定的连续的参数中。它返回成功扫描的项目的数量。如果少于参数的数量,Err将报告原因。输入中的换行符必须与格式中的换行符一致。有一个例外:动词%c总是扫描输入中的下一个符文,即使它是一个空格(或制表符等)或换行。
Scanf 为输入解析增加了更精细的控制(通过一个格式字符串)。
从控制台读取整行
如果程序需要从标准输入读取整行,与其使用fmt 包,不如使用bufio 包。
这篇文章教大家如何做。在Golang中读入控制台输入。
经验之谈
fmt 包中的 "Scan "系列方法是用来从标准输入中读取标记和其他类型的限定值。
bufio 包更适合于通过命令行界面与用户进行交互。