Go 语言输入

Go 语言输入

在 Go 语言的教程当中,无论简繁,我都没有看到有关输入的例子(虽说 Go 的教程确实很简单,但是在其他的语言,比如 C 和 Java,一开始就说明了怎么进行格式化输入)。但是不管怎么样,教程没讲,并不代表它没有。自己动手,丰衣足食。
Go 语言的各种输入主要是在 fmtbufioio 这三个包里面。但是这些包里面的内容很多,输入的类型也是五花八门。我将分成三篇分别列出这三个包中有关输入的函数。下面我们首先来看一下 fmt 包中的输入。

fmt —— Scanning

fmt 包中实现的是格式化的输入输出,类似于 C 中的 scanf printf

函数

首先我们先来看一下,fmt 包中的输入函数都有那些吧。
// 从一个指定的 io.Reader 中读取
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)
从上面的函数中可以看到,fmt 包中的输入主要分为三个大类型,然后每个大类型又有三个小类型。
这跟 C 是非常类似的,Scan 在读取时会把换行符当作空格;Scanf 可以根据字符串指定的 占位符 进行读取;Scanln 会在换行符处停止扫描,而且要求输入后紧跟换行符或者 EOF。
其余的六个跟这三个类似。
最后返回的是成功扫描的条目数以及错误信息,没有错误信息时返回的是 nil

举例说明

虽然只要有了这些函数,并且了解过 Go 的基础知识,就可以很容易的看懂这些要做的事情。不过有例子终究是可以看的更清楚些,所以下面我们就来看几个具体的例子。
Scan

    var datap int
    fmt.Print("input: ")
    fmt.Scan(&datap)
    fmt.Print("output: ",datap)
 input: 21
 output: 21
Scanf

    var datas1,datas2 string
    fmt.Print("input: ")
    f, _ := fmt.Scanf("%s %s",&datas1,&datas2)
    fmt.Printf("output: Have read %d strings,which is %s and %s",f,datas1,datas2)
 input: hello world
 output: Have read 2 strings,which is hello and world
Scanln

    datap2 := make([]int,4)
    fmt.Println("input: ")
    for i:=0;i<len(datap2) ;i++  {
        fmt.Scanln(&datap2[i])
    }
    fmt.Println("output",datap2)
 input: 
 21
 23
 34
 45
 output: [21 23 34 45]
从上面的三个例子中可以看出,这三个函数更像是一个函数的三个不同的形式,可以针对不同的场景进行适配使用。
Fscan

    file, _ := os.Open("test.in")
    var one, two, three int

    n, _ := fmt.Fscan(file, &one, &two, &three)
    fmt.Printf("output: a totle of %d paras scanned, which is %d, %d, %d", n, one, two, three)
 test.in
 1 2 3   

 output: a totle of 3 paras scanned, which is 1, 2, 3
Sscan

    s := "hello world"
    var p1,p2 string
    n, _ := fmt.Sscan(s,&p1,&p2)
    fmt.Printf("output: A total of %d parameters were scanned, which is %s and %s", n, p1, p2)
 output: A total of 2 parameters were scanned, which is hello and world
提示: 上面的简单例子中,我只是演示了如何读取输入,而 返回的 err 信息我都使用通配符 _ 给忽略掉了,在实际编程中,err 其实是很有用的,特别是在你的代码有了问题,而你不知道问题出在哪里的时候。所以在写完整代码的时候,最好添加对应的代码来处理返回的 err 信息。

了解更多

这些内容在 Go 的官方包文档中都有详细的说明,如果你还想了解更多,可以参考完整的 fmt 包说明。
也欢迎关注我之后的文章。
:)

此博客中的热门博文

pandoc 简单使用

在 GitPage 上部署 Hugo 博客

在 Virtual Box 中安装 Remix OS