博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go基础系列:读取标准输入(一)
阅读量:6703 次
发布时间:2019-06-25

本文共 3125 字,大约阅读时间需要 10 分钟。

hot3.png

fmt包中提供了3类读取输入的函数:

  • Scan家族:从标准输入os.Stdin中读取数据,包括Scan()、Scanf()、Scanln()
  • SScan家族:从字符串中读取数据,包括Sscan()、Sscanf()、Sscanln()
  • Fscan家族:从io.Reader中读取数据,包括Fscan()、Fscanf()、Fscanln()

其中:

  • Scanln、Sscanln、Fscanln在遇到换行符的时候停止
  • Scan、Sscan、Fscan将换行符当作空格处理
  • Scanf、Sscanf、Fscanf根据给定的format格式读取,就像Printf一样

这3家族的函数都返回读取的记录数量,并会设置报错信息,例如读取的记录数量不足、超出或者类型转换失败等。

以下是它们的定义方式:

$ 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类函数是一样的。

Scan、Scanf和Scanln

Scan家族函数从标准输入读取数据时,将以空格为分隔符分隔标准输入中的内容,并将分隔后的各个记录保存到给定的变量中。其中Scanf()可以指定分隔符。

例如,使用Scanln函数等待用户输入数据,或从管道中读取数据。下面的代码将等待用户输入,且将读取的内容分别保存到name变量和age变量中:

package mainimport (    "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的时候终止读取,所以在输入的时候只要按下回车键就会结束读取。

运行它,将提示输入姓名:

请输入姓名和年龄,空格分隔:周伯通 69name: 周伯通age: 69

同理Scanf()也在遇到换行符或EOF的时候终止读取行为。使用Scanf()的时候,需要给定格式化字符串形式:

例如:

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)请输入姓名和年龄,空格分隔:周伯通87name: 周伯通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 = nilmalongshuai        // n = 1, err != nilmalongshuai long   // n = 2, err != nilmalongshuai 23 23  // n = 2, err != nil

Sscan、Sscanf和Scanln

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 mainimport (    "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)

使用bufio中读取标准输入

除了fmt包的Scan类函数,bufio包也可以读取标准输入。当然,读取标准输入只是它的一个功能示例,它的作用是操作缓冲

转载于:https://my.oschina.net/u/3683692/blog/3039767

你可能感兴趣的文章
百度分享代码(备用)
查看>>
SqlMapConfig.xml 配置
查看>>
wget用法详解
查看>>
在多个线程中避免和发现伪共享
查看>>
[Ubuntu] Ubuntu如何查看cronjob
查看>>
session监听
查看>>
Android Studio更新升级方法
查看>>
virtualbox主机与虚拟机互访,虚拟机上网
查看>>
ios相关手册、图表等综合
查看>>
SharpZipLib 文件/文件夹压缩
查看>>
百分比定位加position定位的常用布局
查看>>
Codeforces Round #257 (Div. 2/A)/Codeforces450A_Jzzhu and Children
查看>>
android 拍照注意问题
查看>>
form中的button按钮在IE11中自动提交表单问题导致弹出框关闭之后表单被重置
查看>>
在多个游戏视图间切换环境准备
查看>>
Linux命令-权限管理命令:chown
查看>>
第三方推送-使用推
查看>>
Hadoop 2.2.0 HA构造
查看>>
WIN8系统中 任务管理器 性能栏 显示CPU利用率(已暂停)怎么回事?
查看>>
java如何将毫秒数转为相应的年月日格式
查看>>