fmt包中提供了3类读取输入的函数:web
其中:函数
这3家族的函数都返回读取的记录数量,并会设置报错信息,例如读取的记录数量不足、超出或者类型转换失败等。spa
如下是它们的定义方式:code
$ go doc fmt | grep -Ei "func [FS]*Scan" func Fscan(r io.Reader, a ...interface{}) (n int, err error) func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error) func Fscanln(r io.Reader, a ...interface{}) (n int, err error) func Scan(a ...interface{}) (n int, err error) func Scanf(format string, a ...interface{}) (n int, err error) func Scanln(a ...interface{}) (n int, err error) func Sscan(str string, a ...interface{}) (n int, err error) func Sscanf(str string, format string, a ...interface{}) (n int, err error) func Sscanln(str string, a ...interface{}) (n int, err error)
由于还没介绍io.Reader,因此Fscan家族的函数暂且略过,但用法和另外两家族的scan类函数是同样的。orm
Scan家族函数从标准输入读取数据时,将以空格为分隔符分隔标准输入中的内容,并将分隔后的各个记录保存到给定的变量中。其中Scanf()能够指定分隔符。字符串
例如,使用Scanln函数等待用户输入数据,或从管道中读取数据。下面的代码将等待用户输入,且将读取的内容分别保存到name变量和age变量中:input
package main import ( "fmt" ) func main() { var ( name string age int ) fmt.Print("输入姓名和年龄,使用空格分隔:") fmt.Scanln(&name, &age) fmt.Printf("name: %s\nage: %d\n", name, age) }
由于Scanln()遇到换行符或EOF的时候终止读取,因此在输入的时候只要按下回车键就会结束读取。string
运行它,将提示输入姓名:it
请输入姓名和年龄,空格分隔: 周伯通 69 name: 周伯通 age: 69
同理Scanf()也在遇到换行符或EOF的时候终止读取行为。使用Scanf()的时候,须要给定格式化字符串形式:
例如:io
fmt.Scanf("%s %d",&name,&age)
输入时,第一个字段会转换成字符串格式保存到name
变量中,第二个记录会转换成整数保存到age
中,若是转换失败,将不会进行保存。例如输入malongshuai aaa
,因为aaa
没法转换成int,因此age变量的值仍然为初始化的数值0。
Scanf可指定分隔符,其中上面的是%s %d
中间的空格就是分隔符。例以下面指定:
做为分隔符:
fmt.Scanf("%s : %d",&name,&age)
在输入时,必须按照如下格式进行输入:首先至少一个空格,而后一个冒号,再至少一个空格:
周伯通 : 23 // 或者连续多个空格 "周伯通 : 23" name: 周伯通 age: 23
若是使用的是fmt.Scan()
,则输入数据时能够换行输入,Scan()会将换行符做为空格进行处理,直到读取到了2个记录以后自动终止读取操做:
fmt.Scan(&name, &age) 请输入姓名和年龄,空格分隔:周伯通 87 name: 周伯通 age: 87
通常来讲,只使用Scanf类函数比较好。
这些函数都有返回值:读取的记录数量和err信息。
以Scanln()为例:
func main() { var ( name string age int ) fmt.Print("输入姓名和年龄,使用空格分隔:") n, err := fmt.Scanln(&name, &age) fmt.Printf("name: %s\nage: %d\n", name, age) fmt.Println("records count:",n) fmt.Println("err or not:",err) }
输入:
malongshuai 23 // n = 2, err = nil malongshuai // n = 1, err != nil malongshuai long // n = 2, err != nil malongshuai 23 23 // n = 2, err != nil
Sscan家族的函数用于从给定字符串中读取数据,用法和Scan家族相似。
func Sscan(str string, a ...interface{}) (n int, err error) func Sscanln(str string, a ...interface{}) (n int, err error) func Sscanf(str string, format string, a ...interface{}) (n int, err error)
例如:
package main import ( "fmt" ) func main() { var ( name string age int ) input := "malongshuai 23" fmt.Sscan(input, &name, &age) fmt.Printf("name: %s\nage: %d\n", name, age) }
使用Sscanf()能够指定分隔符:
input := "malongshuai : 23" fmt.Sscanf(input, "%s : %d", &name, &age)
除了fmt包的Scan类函数,bufio包也能够读取标准输入。固然,读取标准输入只是它的一个功能示例,它的做用是操做缓冲