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)
参数间以空格或回车键进行分割。
如果输入的参数不够接收的,按回车后仍然会等待其他参数的输入。
如果输入的参数大于接收的参数,只有给定数量的参数被接收,其他参数自动忽略。
Scanf
func 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 = <nil>
fmt.Println("a = ", a) // a = afdsfdsfdsfds
}
Scanf"%s%d"
n, err := fmt.Scanf("%d=%s", &b, &a)
Scanln
func 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)
}
ScanScanScanlnerror(unexpected newline)n = 1
ScanlnScan
二、bufio包
bufioos.Stdin
bufio
通过创建Reader对象,并调用其Read*系列的方法即可:
创建Reader对象
reader := bufio.NewReader(os.Stdin)
Read
func (b *Reader) Read(p []byte) (n int, err error)
n, err := reader.Read(recv)
这里不会阻塞等待键盘的输入,而是直接返回了,所以无法接受键盘输入。
ReadByte
func (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 = <nil>
}
ReadBytes
func (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。包括空格和回车。
bufio.Readerfmt
ReadLine
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
ReadLine是一个低水平的行数据读取原语。大多数调用者应使用ReadBytes(’\n’)或ReadString(’\n’)代替,或者使用Scanner。
ReadRune
func (b *Reader) ReadRune() (r rune, size int, err error)
rune
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 = <nil>
}
ReadSlice
func (b *Reader) ReadSlice(delim byte) (line []byte, err error)
调用者应尽量使用ReadBytes或ReadString替代本法功法。
ReadString
func (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为终止符时,如果没有遇到该符,即使回车也会继续接收。
如果在按下终止符后没有回车,继续键入内容,则只会接收第一次终止符及其之前的内容,之后的内容自动忽略。