返回

从源码学习 Go 标准库(一):fmt - scan(2)

后端

前言

在上一篇文章中,我们分析了 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 函数的用法,包括对不同类型变量的扫描、类型别名以及接口类型变量的扫描。通过这些扫描函数,我们可以方便地从输入中读取数据并存储到变量中。