最近开始学习GO语言,并做了一些编程练习。有道题要输入带空格的字符串,这在C/C++中很容易实现,但GO中好像并不那么容易。学过C/C++的可能都知道,在C中可以使用gets()函数,在C++可以使用getline()函数来实现输入带空格的字符串。那我们可能要问在GO中有没有类似的函数?答案是否定的。

在GO中除了fmt和os包,我们还可以使用bufio来实现带缓存输入和输出。

我们要怎样读取用户从键盘(控制台)输入的数据?输入是指从键盘或其它标准输入(os.Stdin)读取数据。

使用fmt包里的Scan_或Sscan_系列函数输入

package main

import "fmt"

var (
firstName, lastName string
str1, str2, str3 string
num int
str = "We / love / Go / 1314"
format = "%s / %s / %s / %d"
) func main() {
fmt.Println("Please input your full name: ")
// 使用Scan输入
fmt.Scan(&firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName) fmt.Println("Please again input your full name: ")
// 使用Scanln输入
fmt.Scanln(&firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName) fmt.Println("Please again input your full name: ") // 使用Scanf输入
fmt.Scanf("%s %s", &firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName) fmt.Println("From the str we read: ") // 使用Sscanf读取
fmt.Sscanf(str, format, &str1, &str2, &str3, &num)
fmt.Println(str1, str2, str3, num)
}

若输入为:

xiao hua
xiao ming
xiao hong

则输出为:

Please input your full name:
xiao hua
Hi xiao hua!
Please again input your full name:
xiao ming
Hi xiao ming!
Please again input your full name:
xiao hong
Hi xiao hong!
From the str we read:
We love Go 1314

Scan()函数原型为:

func Scan(a ...interface{}) (n int, err error) {
return Fscan(os.Stdin, a...)
}

Scan从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。

Scanln()函数原型为:

func Scanln(a ...interface{}) (n int, err error) {
return Fscanln(os.Stdin, a...)
}

Scanln类似于Scan,但会在换行符处停止扫描,在最后一个条目后必须有换行符或EOF。

Scanf()函数原型为:

func Scanf(format string, a ...interface{}) (n int, err error) {
return Fscanf(os.Stdin, format, a...)
}

Scanf从标准输入扫描文本,根据format参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

输入中的换行符必须与格式中的换行符匹配。

Sscanf()函数原型为:

func Sscanf(str string, format string, a ...interface{}) (n int, err error) {
return Fscanf((*stringReader)(&str), format, a...)
}

Sscanf从字符串str扫描文本,根据format参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

输入中的换行符必须与格式中的换行符匹配。

Scan与Scanln方法的区别:

  • Scan函数会识别空格左右的内容,哪怕换行符存在也不会影响Scan对内容的获取。
  • Scanln函数会识别空格左右的内容,但是一旦遇到换行符就会立即结束,不论后续还是否存在需要输入的内容。

使用bufio包里带缓冲的Reader实现带空格字符串的输入

package main

import (
"bufio"
"fmt"
"os"
)
//var inputReader *bufio.Reader
//var input string
//var err error func main() { inputReader := bufio.NewReader(os.Stdin) // 使用了自动类型推导,不需要var关键字声明
//inputReader = bufio.NewReader(os.Stdin) fmt.Println("Please input your name: ") //input, err = inputReader.ReadString('\n')
input, err := inputReader.ReadString('\n') if err == nil {
fmt.Printf("Your name is: %s\n", input)
}
}

若输入为:

xiao hua

则输出为:

Please input your name:
xiao hua
Your name is: xiao hua

上例中,inputReader是个指针,它指向一个bufio类的Reader,然后在main函数里,通过bufio.NewReader(os.Stdin)

创建了一个buffer Reader,并联接到inputReader这个变量。

bufio.NewReader()函数原型为:

func NewReader(rd io.Reader) *Reader {
return NewReaderSize(rd, defaultBufSize)
}

任何符合io.Reader接口的对象法都可以作为bufio.NewReader()里的参数,并返回一个新的带缓冲的io.Reader,os.Stdin符合这个条件。这个带缓冲的Reader有一个方法ReadString(delim byte), 这个方法会一直读数据,直到遇到了指定的终止符(delim byte)才结束输入,终止符将成为输入的一部分,一起放到buffer里。

RearString()函数原型为:

func (b *Reader) ReadString(delim byte) (string, error) {
bytes, err := b.ReadBytes(delim)
return string(bytes), err
}

ReadString返回值是读到的字符串及nil。如果在读到结束时没有发现指定的结束符(delim byte),将返回一个 err != nil。在上面的例子中,我们从键盘输入直到键入“\n”才结束。屏幕是标准输出os.Stdout,错误信息被写到os.Stderr。大多情况下,os.Stderr等同os.Stdout。

一般情况下,在GO的代码里省略了变量声明,而直接使用”:=“进行自动类型推导,如:

inputReader := bufio.NewReader(os.Stdin)
input, err := inputReader.ReadString('\n')

总结

GO中Scan_或Sscan_系列函数与C中的scan_系统函数的用法相似,学过C的人可以很快学会这些函数的使用。但要实现带空格字符串的输入,则要使用bufio包里带缓冲的Reader和os包里的os.Stdin。


个人主页:

www.codeapes.cn

GO语言学习笔记1-输入带空格的字符串的更多相关文章

  1. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  2. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  3. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  4. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  5. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  6. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  7. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  8. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  9. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

随机推荐

  1. 手写朴素贝叶斯(naive_bayes)分类算法

    朴素贝叶斯假设各属性间相互独立,直接从已有样本中计算各种概率,以贝叶斯方程推导出预测样本的分类. 为了处理预测时样本的(类别,属性值)对未在训练样本出现,从而导致概率为0的情况,使用拉普拉斯修正(假设 ...

  2. 【GNN】图神经网络小结

    图神经网络小结 图神经网络小结 图神经网络分类 GCN: 由谱方法到空域方法 GCN概述 GCN的输出机制 GCN的不同方法 基于谱方法的GCN 初始 切比雪夫K阶截断: ChebNet 一阶Cheb ...

  3. ubuntu分区建议总结

    本文为转载别人的内容,结合了其他内容,进行分区的总结.其中主要是分区表格,对于ubuntu安装时,进行分区非常有用. 无论是安装Windows还是Linux操作系统,硬盘分区都是整个系统安装过程中最为 ...

  4. [ASP.NET] 解决因为使用 updatepanel 导致 fileupload 始终无法获取文件的方法

    接手了一个新项目,需要在老项目中增添几个新页面 由于在母版页中的updatepanel包住了子版页 同时updatepanel并不支持文件上传,因此要额外增加一些设置 具体的情况可以参考这篇博客 ht ...

  5. CSS3新特性(阴影、动画、渐变)

    一.阴影 1.1文字阴影: text-shadow<length>①: 第1个长度值用来设置对象的阴影水平偏移值.可以为负值 <length>②: 第2个长度值用来设置对象的阴 ...

  6. 通过node指令自动创建一个package.json文件,并封装发布使用

    通过node指令自动创建一个package.json文件,并封装发布使用:https://blog.csdn.net/scu_cindy/article/details/78208268

  7. AppCan适配问题

    使用AppCan调试中心时,屏幕适配是个问题,经过多次调试总结出如下经验: 1,使用HD+(1560 x 720):显示错乱 2,使用FHD+ (2340 x 1080):显示错乱 3,HD (128 ...

  8. 一、bif

    缩进是python的灵魂,缩进可以使python的代码整洁,有层次. python是脚本语言,就是为了简单方便以辅助科学运算,因此python有许多bif,build in function 全部都是 ...

  9. linux下重启tomcat命令

    在Linux系统下,重启Tomcat使用命令操作的! 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看 ...

  10. Delphi 基于组件的编程思想