分享
  1. 首页
  2. 文章

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

学思 · · 49460 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

除了f mt os ,我们还需要用到 bufio 来实现带缓冲输入(input)和输出(output)
读取用户的输入数据
我们怎样读取用户从键盘(控制台)输入的数据?输入指从键盘或其它标准输入(os.Stdin)读取数据。最简单的方法是使用fmt包里的Scan-或Sscan-系列函数,下面用个例子说明一下:
//read input from the console:
packagemain
import"fmt"
var(
firstName,lastName,sstring
iint
ffloat32
input="56.12/5212/Go"
format="%f/%d/%s"
)
funcmain(){
fmt.Println("Pleaseinputyourfullname:")
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("Fromthestringweread:",f,i,s)
}

Scanln 将从标准输入的带有空格的字符串值保存到相应的变量里去,并以一个新行结束输入, Scanf做相同的工作,但它使用第一个参数指时输入格式, Sscan系列函数也是读取输入,但它是用来从字符串变量里读取,而不是从标准(os.Stdin)里读取
另外,我们也可以使用 bufio包里带缓冲的reader,例如
//////////
packagemain
import(
"bufio"
"fmt"
"os"
)
varinputReader*bufio.Reader
varinputstring
varerrerror
funcmain(){
inputReader=bufio.NewReader(os.Stdin)
fmt.Println("Pleaseentersomeinput:")
input,err=inputReader.ReadString('S')//func(b*Reader)ReadString(delimbyte)(linestring,errerror),‘S’ 这个例子里使用S表示结束符,也可以用其它,如'\n'
iferr==nil{
fmt.Printf("Theinputwas:%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下不同的定界符。
packagemain
import(
"bufio"
"fmt"
"os"
)
funcmain(){
inputReader:=bufio.NewReader(os.Stdin)
fmt.Println("pleaseinputyourname:")
input,err:=inputReader.ReadString('\n')
iferr!=nil{
fmt.Println("Therewareerrorsreading,exitingprogram.")
return
}
fmt.Printf("Yournameis%s",input)
//对unix:使用"\n"作为定界符,而window使用"\r\n"为定界符
//Version1
/*
switchinput{
case"Philip\r\n":
fmt.Println("WelcomePhilip!")
case"Chris\r\n":
fmt.Println("WelcomeChris!")
case"Ivo\r\n":
fmt.Println("WelcomeIvo!")
default:
fmt.Println("Youarenotwelcomehere!Goodbye!")
}
*/
//version2
/*
switchinput{
case"Philip\r\n":
fallthrough
case"Ivo\r\n":
fallthrough
case"Chris\r\n":
fmt.Printf("Welcome%s\n",input)
default:
fmt.Printf("Youarenotwelcomehere!Goodbye!")
}
*/
//version3
switchinput{
case"Philip\r\n","Ivo\r\n","Chris\r\n":
fmt.Printf("Welcome%s\n",input)
default:
fmt.Println("Youarenotwelcomehere!Goodbye!")
}
}



有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:学思

查看原文:go语言的标准输入-scan 和bufio

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
49460 次点击 ∙ 3 赞
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏