12.1 读取用户的输入

    示例 12.1 :

    Scanln 扫描来自标准输入的文本,将空格分隔的值依次存放到后续的参数内,直到碰到换行。Scanf 与其类似,除了 Scanf 的第一个参数用作格式字符串,用来决定如何读取。Sscan 和以 Sscan 开头的函数则是从字符串读取,除此之外,与 Scanf 相同。如果这些函数读取到的结果与您预想的不同,您可以检查成功读入数据的个数和返回的错误。

    您也可以使用 bufio 包提供的缓冲读取(buffered reader)来读取数据,正如以下例子所示:

    示例 12.2 readinput2.go

    inputReader 是一个指向 的指针。inputReader := bufio.NewReader(os.Stdin) 这行代码,将会创建一个读取器,并将其与标准输入绑定。

    bufio.NewReader() 构造函数的签名为:func NewReader(rd io.Reader) *Reader

    返回的读取器对象提供一个方法 ReadString(delim byte),该方法从输入中读取内容,直到碰到 delim 指定的字符,然后将读取到的内容连同 字符一起放到缓冲区。

    ReadString 返回读取到的字符串,如果碰到错误则返回 nil。如果它一直读到文件结束,则返回读取到的字符串和 io.EOF。如果读取过程中没有碰到 delim 字符,将返回错误 err != nil

    在上面的例子中,我们会读取键盘输入,直到回车键(\n)被按下。

    屏幕是标准输出 os.Stdoutos.Stderr 用于显示错误信息,大多数情况下等同于 os.Stdout

    一般情况下,我们会省略变量声明,而使用 :=,例如:

    我们将从现在开始使用这种写法。

    示例 12.3 :

    注意:Unix和Windows的行结束符是不同的!

    练习

    练习 12.1: word_letter_count.go

    编写一个程序,从键盘读取输入。当用户输入 ‘S’ 的时候表示输入结束,这时程序输出 3 个数字:
    i) 输入的字符的个数,包括空格,但不包括 ‘\r’ 和 ‘\n’
    ii) 输入的单词的个数
    iii) 输入的行数

    练习 12.2: