Golang 处理键盘输入的两种方法(fmt & bufio) |
您所在的位置:网站首页 › go输出快捷键 › Golang 处理键盘输入的两种方法(fmt & bufio) |
一、fmt包
fmt.Scanfmt.Scanffmt.Scanln
Scan
func Scan(a ...interface{}) (n int, err error) Scan从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。 var a1 int var a2 string n, err := fmt.Scan(&a1, &a2)参数间以空格或回车键进行分割。 如果输入的参数不够接收的,按回车后仍然会等待其他参数的输入。 如果输入的参数大于接收的参数,只有给定数量的参数被接收,其他参数自动忽略。 Scanffunc Scanf(format string, a ...interface{}) (n int, err error) egg: package main import "fmt" func main() { var a string n, err := fmt.Scanf("%s", &a) // afdsfdsfdsfds fmt.Println("n = ", n) // n = 1 fmt.Println("err = ", err) // err = fmt.Println("a = ", a) // a = afdsfdsfdsfds }同样,Scanf也可以接收多个参数,但是接收字符串的话,只能在最后接收; 否则按照"%s%d"的格式进行接收,无论输入多少字符(包含数字),都会被认定是第一个字符串的内容,不会被第二个参数所接收。 n, err := fmt.Scanf("%d=%s", &b, &a) Scanlnfunc Scanln(a ...interface{}) (n int, err error) Scanln与Scan类似,但在换行时停止扫描,并且在最后一项之后必须有换行或EOF。 package main import "fmt" func main() { var a string var b string n, err := fmt.Scanln(&a, &b) fmt.Println("n = ", n) fmt.Println("err = ", err) fmt.Println("a = ", a) fmt.Println("b = ", b) }Tips: 与Scan的区别:如果设置接收2个参数,Scan在输入一个参数后进行回车,会继续等待第二个参数的键入;而Scanln直接认定输入了一个参数就截止了,只会接收一个参数并产生error(unexpected newline),且n = 1。 说通俗写,就是Scanln认定回车标志着【阻塞接收参数】结束, 而Scan认定回车只是一个分隔符(或空白)而已。 二、bufio包bufio包是对IO的封装,可以操作文件等内容,同样可以用来接收键盘的输入,此时对象不是文件等,而是os.Stdin,也就是标准输入设备。 bufio包文档 bufio包含了Reader、Writer、Scanner等对象,封装了很多对IO内容的处理方法,但应对键盘输入来说,使用Reader对象(或Scanner对象)即可,其他略。 通过创建Reader对象,并调用其Read*系列的方法即可: func (b *Reader) Read(p []byte) (n int, err error) n, err := reader.Read(recv)这里不会阻塞等待键盘的输入,而是直接返回了,所以无法接受键盘输入。 ReadBytefunc (b *Reader) ReadByte() (c byte, err error) 用来接收一个byte类型,会阻塞等待键盘输入。 package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) n, err := reader.ReadByte() // a fmt.Println("n = ", n) // n = 97 fmt.Println("string =", string(n)) // string = a fmt.Println("err = ", err) // err = } ReadBytesfunc (b *Reader) ReadBytes(delim byte) (line []byte, err error) 该方法,输入参数为一个byte字符,当输入遇到该字符,会停止接收并返回。 接收的内容包括该停止字符以及前面的内容。 package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) n, err := reader.ReadBytes('\n') fmt.Println("n = ", n) fmt.Println("string =", string(n)) fmt.Println("err = ", err) }以上测试结果如下: 可以看到,输入的内容为【a】【空格】【b】【回车】 n同时接收了4个byte。包括空格和回车。 Tips: Reader可以接收包含空格内容的字符串,而不进行分割,这是bufio.Reader与fmt系的一大不同。 ReadLinefunc (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) ReadLine是一个低水平的行数据读取原语。大多数调用者应使用ReadBytes(’\n’)或ReadString(’\n’)代替,或者使用Scanner。 ReadRunefunc (b *Reader) ReadRune() (r rune, size int, err error) rune用来处理unicode或utf-8字符,该函数可以接收该类字符,返回接收字符的rune值、size大小(即字节数)以及error。 package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) r, size, err := reader.ReadRune() // 龙 fmt.Println("r = ", r) // r = 40857 fmt.Println("string =", string(r)) // string = 龙 fmt.Println("size =", size) // size = 3 fmt.Println("err = ", err) // err = } ReadSlicefunc (b *Reader) ReadSlice(delim byte) (line []byte, err error) 调用者应尽量使用ReadBytes或ReadString替代本法功法。 ReadStringfunc (b *Reader) ReadString(delim byte) (line string, err error) ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。 package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) line, err := reader.ReadString('\n') fmt.Println("line = ", line) fmt.Println("err = ", err) }该函数可以接收包含空格的字符串。 如果设定回车键为delim byte,则遇到回车后结束接收,同时也会接收回车键。 当以’a’等byte为终止符时,如果没有遇到该符,即使回车也会继续接收。 如果在按下终止符后没有回车,继续键入内容,则只会接收第一次终止符及其之前的内容,之后的内容自动忽略。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |