TLDR;你将学习如何读取用户输入,包括较简单的技术和使用格式化器的较高级技术
能够从控制台读取用户输入是一件很重要的事情。它给了用户一个与程序互动的机会。要考虑的事情是你如何要求用户输入,是一个词,还是几个输入。用户会不会用空格或换行来分隔输入?无论你采用哪种方法,都要尽量把所选择的方法传达给用户。
用fmt管理用户输入
到目前为止,你已经看到了fmt 包是如何被用来打印到控制台的。它也可以用来读取用户输入。
fmt 库有一个内置的Scan() 方法,我们将用它来捕获用户输入。
读取一个输入
你可能一开始就想从用户那里读取一个输入。这就是Scan() 方法默认的做法。
这里有一些代码显示了如何收集用户输入。
package main
import "fmt"
func main() {
var response string
fmt.Scan(&response)
fmt.Println("User typed: ", response)
}
请注意你是如何使用& 操作符,将字符串response 作为一个引用送入的。这样做是因为Scan() 方法将修改你送进去的变量。
当你运行这段代码时,你会看到下面的输出。
hello
User typed: hello
读取多个输入
你可以向Scan() 方法提供几个参数。通过提供几个参数,你可以收集一个以上的用户输入,并在Scan() 函数中用逗号分隔每个输入。下面是如何应用这一技术的。
var a1, a2 string
// multiple input
fmt.Scan(&a1, &a2)
// formatted string to print out the user input
str := fmt.Sprintf("a1: %s a2: %s", a1, a2)
请注意,a1 和a2 是如何被送入Scan() 的,它们是用逗号分开的。那么,这些代码将如何运行?
当你运行这段代码时,有两种方式让用户输入。用户可以像这样用空格隔开这些值。
hi you
a1: hi a2: you
或者用换行符。
hi
you
a1: hi a2: you
Scanf() ,用格式化器扫描输入
到目前为止,你已经看到了如何用空格和换行作为分隔符来收集输入。你也可以在收集输入的方式上非常具体。想象一下,用户想输入一个发票号码,比如 "INV200 "或 "INV114",你感兴趣的是数字部分,或者你对前缀也感兴趣?
解决这个问题的答案就在Scanf() 函数中。它需要格式化器。有了格式化器,你就能挑选你感兴趣的用户输入的部分,并将其放入你想要的变量中。
在上面提到的例子中,你可以构建这样的代码。
var prefix string
var no int
// in110
fmt.Scanf("%3s%d", &prefix, &no)
fmt.Printf("prefix: %s, invoice no: %d", prefix, no)
有趣的部分在于Scanf() 的第一个参数,即3s%d 。其含义是,取前3个字符,%3s ,并解释为一个字符串。然后将剩下的解释为数字,%d 。
运行这个程序,你会得到这样的输出。
inv200
prefix: inv, invoice no: 200
"inv "被放置在prefix ,200被放置在no 变量中。
了解更多
要了解更多关于这个程序的信息,请查看这个链接pkg.go.dev/fmt#Scanf
总结
在这篇文章中,你学会了如何读取用户输入。你还看了一个使用格式化器的更高级的技术。