这是我参与「第三届青训营-后端场」笔记创作活动的的第4篇笔记
Go输入
- Scan
- Scanln
- Scanf
Scan
输入:读取以空白符分割的值返回到地址中进行修改,换行视为空白符
返回值:错误处理,返回值中有一个int类型的值是返回正确的数量,有一个err是错误的原因
var n1, n2 string
fmt.Scan(&n1, &n2)
Scanln
Scanln 类似 Scan,但它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。使用场景就是只要换行就结束(一行一行地读取数据,用多个Scanln函数输入数据时要分多行)
返回错误和Scan一样
var n1, n2 string
fmt.Scanln(&n1)
fmt.Scanln(&n2)
Scanf
用于格式化输入,需要用到格式占位符
返回值: 它返回成功扫描的项目数
例子:
var s string
var n int
fmt.Scanf("%s", &s)
fmt.Scanf("%d", &n)
一些格式:
- %v 值的默认格式表示
- %+v 类似%v,但输出结构体时会添加字段名
- %#v 值的Go语法表示
- %T 值的类型的Go语法表示
- %% 百分号
- %t 单词true或false
- %b 表示为二进制
- %c 该值对应的unicode码值
- %d 表示为十进制
- %o 表示为八进制
- %q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
- %x 表示为十六进制,使用a-f
- %X 表示为十六进制,使用A-F
- %U 表示为Unicode格式:U+1234,等价于"U+%04X"
Go defer
介绍:defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,通常用于释放资源。
因为后申请的资源和可能对前面申请的资源有依赖。如果先将前面申请的资源释放掉了。对于后面的资源可能会造成影响。所以先释放后申请的资源,再释放前面申请的资源。
defer什么时间执行
前面说到,defer只有在当前函数执行完毕后,才会执行。其实不太准确。
go中的return语句并不是原子性操作,一般是分为两步:
将返回值赋值给一个变量
执行RET指令。
defer就执行在1之后,2之前。