在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\n200",&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('\n')
fmt.Printf("n: %s",input)
}
//这样会将换行符之前的数据全部赋值给input
有疑问加站长微信联系(非本文作者)