Go语言中的fmt.Scan使用说明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言中的fmt.Scan使用说明相关的知识,希望对你有一定的参考价值。

在go语言中如果想获取用户输入,会用到Scan方法。scan在go语言中有很多中,今天介绍一下他们的使用方法和不同点。

和print类似,scan也分为三大类:

  • Scan、Scanf和Scanln: 从标准输入os.Stdin读取文本(从终端获取数据)
  • Fscan、Fscanf、Fscanln: 从指定的io.Reader接口读取文本(通用)
  • Sscan、Sscanf、Sscanln: 从一个参数字符串读取文本(从字符串string获取数据)

Scan:

语法: func Scan(a ...interface{}) (n int, err error)
例:
func main() {
          var str string
          fmt.Printf("请输入内容:")
          fmt.Scan(&str)
          fmt.Printf("str: %s",str)
}
/* scan将碰到第一个空格或换行符之前的内容赋值给变量。如果
scan中有多个变量,变量值用空格或换行符分割。所以换行和空
格是不能存储到变量内的。
*/

Scanf:

语法:func Scanf(format string, a ...interface{}) (n int, err error)
例:
func main() {
    var (
        name string
        age int
    )   
    fmt.Printf("请输入内容:")
    fmt.Scanf("name:%s age:%d",&name,&age)
    fmt.Printf("n: %s, a:%d",name,age)
}   

Scanln:

语法:func Scanln(a ...interface{}) (n int, err error)
例:
func main() {
    var str string
    fmt.Printf("请输入内容:")
    fmt.Scanln(&str)
    fmt.Printf("str: %s",str)
}       
//Scanln类似Scan,但在遇到换行符时会立刻停止扫描。

总结:Scan和Scanln基本相同,唯一区别是当读取多个变量当时候,遇到换行符Scanln会直接结束,未读到输入值的变量为零值;Scan会等待,直到输入的值满足参数的个数后再遇到换行符才会结束。

Sscan,Sscanf,Sscanln

语法
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
例:
func main() {
    var i1,i2 int
    fmt.Sscan("100
200",&i1,&i2)
    fmt.Printf("int1: %d,int2: %d", i1,i2)
}
//用法和scan基本一样,只是改成从字符串获取数据

Fscan、Fscanf、Fscanln:

func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
/*
只要对象实现了read方法(满足io.Reader接口),就能使用此方法。上面提到的Scan,Scanf,Scanln和Sscan,Sscanf,Sscanln都是有此方法封装而来。
使用方法和上面相同,只不过要多指定一个实现read方法的源。
*/

因为上面的方法都是以空格作为分割符的,所以不能获取含有空格的数据。如果有这方面的需求,可以使用bufio来实现。如下:

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("输入信息:")
    input, _ := reader.ReadString(‘
‘)
    fmt.Printf("n: %s",input)
}
//这样会将换行符之前的数据全部赋值给input

以上是关于Go语言中的fmt.Scan使用说明的主要内容,如果未能解决你的问题,请参考以下文章

Go语言获取标准输入

golang碎片整理之 fmt.Scan

标准库 - fmt/scan.go 解读

原创go语言学习(十四)IO操作1

go语音基础之输入的使用

Golang 指针和结构体