返回
从源码学习 Go 标准库(一):fmt - scan(2)
后端
2023-10-31 11:11:22
前言
在上一篇文章中,我们分析了 fmt 包中 scan 函数的前三层函数。在本文中,我们将继续分析不同类型变量对应的扫描函数,并顺便看一下接口类型变量的扫描。
不同类型变量的扫描
fmt 包中提供了许多不同的扫描函数,用于扫描不同类型的数据。这些扫描函数的命名规则通常为 Scan<类型名称>,例如,用于扫描字符串的函数为 ScanString。
以下是 fmt 包中提供的一些扫描函数:
- ScanBool:扫描布尔值
- ScanByte:扫描字节
- ScanComplex128:扫描复数
- ScanComplex64:扫描复数
- ScanFloat32:扫描 32 位浮点数
- ScanFloat64:扫描 64 位浮点数
- ScanInt:扫描有符号整数
- ScanInt16:扫描 16 位有符号整数
- ScanInt32:扫描 32 位有符号整数
- ScanInt64:扫描 64 位有符号整数
- ScanInt8:扫描 8 位有符号整数
- ScanRune:扫描字符
- ScanString:扫描字符串
- ScanUint:扫描无符号整数
- ScanUint16:扫描 16 位无符号整数
- ScanUint32:扫描 32 位无符号整数
- ScanUint64:扫描 64 位无符号整数
- ScanUint8:扫描 8 位无符号整数
这些扫描函数的使用方法与之前介绍的 Scan 函数类似,只需要将要扫描的数据作为参数传递给扫描函数即可。例如,以下代码演示了如何使用 ScanString 函数扫描字符串:
package main
import (
"fmt"
)
func main() {
var str string
fmt.ScanString(&str)
fmt.Println(str)
}
类型别名的扫描
如果我们定义了一个类型别名,那么我们也可以使用 fmt 包中的扫描函数来扫描该类型别名的变量。例如,以下代码演示了如何使用 ScanString 函数扫描一个类型别名为 MyString 的变量:
package main
import (
"fmt"
)
type MyString string
func main() {
var str MyString
fmt.ScanString(&str)
fmt.Println(str)
}
接口类型变量的扫描
fmt 包中的扫描函数也可以用于扫描接口类型变量。例如,以下代码演示了如何使用 ScanString 函数扫描一个接口类型变量:
package main
import (
"fmt"
"io"
)
func main() {
var r io.Reader
fmt.ScanString(&r)
fmt.Println(r)
}
总结
在本文中,我们分析了 fmt 包中 scan 函数的用法,包括对不同类型变量的扫描、类型别名以及接口类型变量的扫描。通过这些扫描函数,我们可以方便地从输入中读取数据并存储到变量中。