本文只讲scanf、scan、scanln这三个函数因为我现在只用到了这些 过来记录一下
Scanf
package main
import "fmt"
func main() {
var name string
var password string
fmt.Printf("请输入name||password: ")
// Scanf返回值 n: 成功数、err:
s, err := fmt.Scanf("%s %s", &name, &password)
if err != nil {
fmt.Println(err)
}
fmt.Println("成功输入个数: ", s)
fmt.Printf("name: %s - password: %s", name, password)
}
这两种写法都一样,Scanf不可以把名字和密码分两行输入
输出结果
请输入name||password: 123 321
成功输入个数: 2
name: 123 - password: 321
Scan
和scanf差不多,都有两个返回值,一个读取成功个数,另一个错误值
如果需要分行输入可以用scan函数,实现如下
package main
import "fmt"
func main() {
var name string
var password string
fmt.Println("请依次输入name、password")
// Scan返回值 n: 成功数、err:
s, err := fmt.Scan(&name, &password)
if err != nil {
fmt.Println(err)
}
/*
效果同上
n, err := fmt.Scan(&name)
n, err := fmt.Scan(&password)
*/
fmt.Println("成功输入个数: ", s)
fmt.Printf("name: %s - password: %s", name, password)
}
运行结果
请依次输入name、password
123
321
成功输入个数: 2
name: 123 - password: 321
Scanln
Scanln又不同了
package main
import "fmt"
func main() {
var name string
var password string
fmt.Println(">>> Scanln(n,p) <<<")
// Scan返回值 n: 成功数、err:
s, err := fmt.Scanln(&name, &password) // 这个写法name、password必须写在一行
if err != nil {
fmt.Println(err)
}
fmt.Println(">>> Scanln(n) <<<")
// 这样可以分行输入
s, err = fmt.Scanln(&name)
fmt.Println(">>> Scanln(p) <<<")
s, err = fmt.Scanln(&password)
fmt.Println("成功输入个数: ", s)
fmt.Printf("name: %s - password: %s", name, password)
}
运行结果
>>> Scanln(n,p) <<<
123 321
>>> Scanln(n) <<<
123
>>> Scanln(p) <<<
321
成功输入个数: 1
name: 123 - password: 321
总结
Scanf: 按照给定的格式依次读取数据(包括非法数据)不能换行输入(如果要换行需要在前面加一个scanln吸收掉回车符, 就像c语言中的getchar) Scan: 比Scanf高级, 依次读取数据, 遇到回车会忽略, 可以换行输入(如果要先用了Scan输入, 再用Scanf输入的话, 需要在中间加一个Scanln) Scanln:类似Scan,但是遇到换行、回车,立马结束输入,如果要换行输入须用多个Scanln