格式化输入

文章详细对比了Golang中从不同源读取输入的函数,如Scan系列从标准输入读取,Sscan系列从字符串中读取,Scanf系列按照格式读取。它们在处理换行和参数分隔上有差异,Scan遇到空格或换行结束,Scanln遇到换行结束,Scanf则需匹配格式中的换行。示例代码展示了如何使用这些函数读取不同类型的数据,包括byte类型和格式化输入。

1、golang不同输入语句的区别:

特点
ScanScanlnScanf从控制台读取内容
SscanSscanlnSscanf从指定字符串中读取内容
FscanFscanlnFscanf从文本中读取内容
特点在读取内容的时候不会关注换行在读取内容的时候, 遇到换行时结束以格式化的方式读取内容,遇到换行时结束

2、fmt.Scan(a ...interface{}) (n int, err error):

Scan扫描从标准输入读取的文本,将连续的空格分隔值存储在连续的参数中,换行符算作空格。它返回成功扫描的项目数,如果小于参数的数量,则err将报告错误原因。例如:

package main

import "fmt"

func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Println("请输入姓名,年龄,是否已婚")
	//Scan可以接收多个参数,用户输入参数默认使用空格或者回车换行符分割输入设备传入的参数,直到接收所有的参数为止。
	fmt.Scan(&name, &age, &married)
	fmt.Println(name, age, married)
}

注意: golang中使用"&"获取score变量(要定义的变量,也就是变量名)的内存地址(即取变量内存地址的运算符),通过键盘输入为score变量指向的内存地址赋初值。

3、func Scanln(a ...interface{}) (n int, err error):

Scanln类似于Scan,但是如果遇到换行就停止扫描,并且在最后一项之后必须有换行符或者EOF。例如:

package main

import "fmt"

func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Println("请输入姓名,年龄,是否已婚")
    //可以接收多个参数,用户输入参数默认使用空格分割输入设备传入的参数,遇到回车换行符就结束接收参数
    result, err := fmt.Scanln(&name, &age, &married)
	fmt.Println(result)
	fmt.Println(err)
	fmt.Println(name, age, married)
}

 4、func Scanf(format string, a ...interface{}) (n int, err error):

Scanf扫描从标准输入读取文本,将连续的空格分隔值存储到由格式确定的连续参数中,它返回成功扫描的项目数。如果这小于参数的数量,则err将报告错误原因。输入中的换行符必须与格式中的换行符匹配。例如:

package main

import "fmt"

func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Println("请输入姓名,年龄,是否已婚")
    //可以接收多个参数,用户输入参数默认使用空格分割输入设备传入的参数,遇到回车换行符就结束接收参数;还可以格式化输入的数据类型
	result, err := fmt.Scanf("%s %d \n %t", &name, &age, &married)
	fmt.Println(result)
	fmt.Println(err)
	fmt.Println(name, age, married)
}

 5、输入byte类型的数据:byte 类型是 uint8 的别名,代表了 ASCII 码的一个字符,因此在标准输入byte类型的变量时必须接受的是一个数字。例如:

package main

import "fmt"

func main() {
	var input byte
    fmt.Println("请输入一个字母:")
	result, err := fmt.Scan(&input)
	if err != nil {  //"nil"在这里表示空,可以简单的看成其它语言中的null
		fmt.Println("err:", err)
	}
	fmt.Println(result)
	fmt.Println(input)
}

 如果一定要输入字符类型,可以使用Scanf来进行输入:

package main

import "fmt"

func main() {
	var input byte
    fmt.Println("请输入一个字母:")
	result, err := fmt.Scanf("%c", &input)  //"%c"表示将指定数据转换成ascII码中的字符,将ascII码中的字符转换成对应的数据。
	if err != nil {
		fmt.Println("err:", err)
	}
	fmt.Println(result)
	fmt.Println(input)
}

 6、func Sscan(str string, a ...interface{}) (n int, err error):

参数含义
str string此参数表示将要扫描的指定文本。
a …interface{}此参数接收每个文本。

例如:

package main

import "fmt"

func main() {
    //从指定字符串中读取内容
	var (
		name string
		age  int
	)
	fmt.Sscan("zhangsan 18", &name, &age)
	fmt.Println(name, age)
}

7、 func Sscanf(str string, format string, a ...interface{}) (n int, err error):

参数含义
str string此参数表示将要扫描的指定文本。
format string用于指定字符串的每个元素,此参数是不同的格式类型。
a …interface{}此参数接收字符串的每个元素。

例如:

package main

import "fmt"

func main() {
    //从指定字符串中按照格式读取内容
    var (
		name string
		age  int
	)
    result, err := fmt.Sscanf("my name is zhangsan age 18", "my name is %s age %d", &name, &age)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(result)
	fmt.Println(name, age)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值