Go语言的标准输入-scan 和bufio

除了f mt 和 os ,我们还需要用到 bufio 来实现带缓冲输入(input)和输出(output)读取用户的输入数据我们怎样读取用户从键盘(控制台)输入的数据?输入指从键盘或其它标准输入(os.Stdin)读取数据。最简单的方法是使用fmt包里的Scan-或Sscan-系列函数,下面用个例子说明一下://read input from the console:

package main

import "fmt"

var (

   firstName, lastName, s string

   i int

   f float32

   input = "56.12 / 5212 / Go"

   format = "%f / %d / %s"

)

func main() {

   fmt.Println("Please input your full name: ")

   fmt.Scanln(&firstName, &lastName)

// fmt.Scanf(“%s %s”, &firstName, &lastName) 

   fmt.Printf("Hi %s %s!\n", firstName, lastName)

   fmt.Sscanf(input, format, &f, &i, &s)

   fmt.Println("From the string we read: ", f, i, s)

}
复制代码
Scanln 将从标准输入的带有空格的字符串值保存到相应的变量里去,并以一个新行结束输入, Scanf做相同的工作,但它使用第一个参数指时输入格式, Sscan系列函数也是读取输入,但它是用来从字符串变量里读取,而不是从标准(os.Stdin)里读取
另外,我们也可以使用 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)
   fmt.Println("Please enter some input: ")
   input, err = inputReader.ReadString('S') //func (b *Reader) ReadString(delim byte) (line string, err error) ,‘S’ 这个例子里使用S表示结束符,也可以用其它,如'\n'
   if err == nil {
       fmt.Printf("The input was: %s\n", input)
   }
}
Please enter some input:
abcd

abc
S
The input was: abcd

abc
S



上例中,inputReader 是个指针,它指向一个 bufio类的Reader,然后在main函数里,通过了bufio.NewReader(os.Stdin)创建了一个buffer reader, 并联接到inputReader这个变量。bufio.NewReader() 构造器的原型是这样的
func NewReader(rd io.Reader) *Reader


任何符合io.Reader接口的对象(即实现了Read()方法对象)都可以作为bufio.NewReader()里的参数,并返回一个新的带缓冲的io.Reader, os.Stdin 符合这个条件。这个带缓冲的reader有一个方法ReadString(delim byte), 这个方法会一直读数据,直到遇到了指定的终止符,终止符将成为输入的一部分,一起放到buffer里去。
ReadString 返回的是读到的字符串及nil;当读到文件的末端时,将返回把读到的字符串及io.EOF,如果在读到结束时没有发现所指定的结束符(delim byte),将返回一个 err !=nil 。在上面的例子中,我们从键盘输入直到键入“S”。屏幕是标准输出os.Stdout,错误信息被写到os.Stderr,大多情况下,os.Stderr等同os.Stdout。
一般情况下,在GO的代码里,里省略了变量声明,而直接使用”:=“也声明,如:
inputReader := bufio.NewReader(os.Stdin)
input ,err :=inputReader.ReadString('\n')
下面的例子是使用了带关键字switch的,注意Go 的switch的几种形式以及unix和windows下不同的定界符。
package main
import (
   "bufio"
   "fmt"
   "os"
)
func main() {
   inputReader := bufio.NewReader(os.Stdin)
   fmt.Println("please input your name:")
   input, err := inputReader.ReadString('\n')
   if err != nil {
       fmt.Println("There ware errors reading,exiting program.")
       return
   }
   fmt.Printf("Your name is %s", input)
   //对unix:使用“\n”作为定界符,而window使用"\r\n"为定界符
   //Version1
   /*
       switch input {
       case "Philip\r\n":
           fmt.Println("Welcome Philip!")
       case "Chris\r\n":
           fmt.Println("Welcome Chris!")
       case "Ivo\r\n":
           fmt.Println("Welcome Ivo!")
       default:
           fmt.Println("You are not welcome here! Goodbye!")
       }
   */
   //version2
   /*
       switch input {
       case "Philip\r\n":
           fallthrough
       case "Ivo\r\n":
           fallthrough
       case "Chris\r\n":
           fmt.Printf("Welcome %s\n", input)
       default:
           fmt.Printf("You are not welcome here! Goodbye!")
       }
   */
   //version3
   switch input {
   case "Philip\r\n", "Ivo\r\n", "Chris\r\n":
       fmt.Printf("Welcome %s\n", input)
   default:
       fmt.Println("You are not welcome here! Goodbye!")
   }
}

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

golang(Go语言) byte/[]byte 与 二进制形式字符串 互转

效果 把某个字节或字节数组转换成字符串01的形式,一个字节用8个”0”或”1”字符表示。比如: byte(3) –> “00000011” []byte{1...

4407
来自专栏柠檬先生

Angularjs基础(十)

ng-blur  描述:规定blur 事件的行为       实例:当输入框失去焦点的(onblur)时执行表达式:         <input ng...

2005
来自专栏与神兽党一起成长

手工实现表单重置的部分功能

首先我必须说几乎所有的人都不需要自己实现表单重置的功能,表单重置功能只需要一个reset类型的input就足够了。<input type="reset" />

1383
来自专栏青青天空树

MFC-简单的函数使用

1.   MessageBox(str);很简单的一个函数,该函数参数为字符串.用来弹出一个窗口显示str的内容,str为一个字符串.

1424
来自专栏AhDung

【C#】妈妈再也不用担心自定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚

------------------更新:201411190903------------------

1042
来自专栏源码之家

EXCEL取消合并且等于原合并值

1534
来自专栏mySoul

js 和 css动画

使用setTimeout()或者setInterval()使用这两个函数定时调用一段代码。这是其原理。

1606
来自专栏互联网杂技

js事件

1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body...

36611
来自专栏分布式系统和大数据处理

Go语言Tips

转型到Go以后,因为语言的不熟悉,以往很常见的一些操作有时候也需要去Google一下。这里将一些结果记录下来,方便日后查阅。

1342
来自专栏移动开发面面观

React Native的props

1243

扫码关注云+社区