从源码学习 Go 标准库(一):fmt - print(4)
2023-09-10 21:51:33
引言
在前三篇文章中,我们介绍了 Go 标准库中 fmt 包的基本用法、print 函数的调用过程以及 doPrintf 函数中格式化字符串的解析过程。在这篇文章中,我们将完成对 doPrintf 函数的分析,深入了解宽度和精度处理部分,并探讨 fmt 中导出接口方法的调用位置。
宽度和精度处理
在 doPrintf 函数中,宽度和精度处理由 printArg 函数负责。printArg 函数接收一个待打印的值和一个格式化字符串,根据格式化字符串中的宽度和精度规范来处理值。
宽度规范
宽度规范指定了打印输出的最小宽度。如果打印输出的实际宽度小于宽度规范,则会在输出前面填充空格。宽度规范以一个正整数表示,位于格式化字符串中 % 符号后面。例如,"%10s" 指定打印输出的最小宽度为 10 个字符。
精度规范
精度规范指定了打印输出的最大宽度。如果打印输出的实际宽度大于精度规范,则会截断输出。精度规范以一个点(.)和一个正整数表示,位于格式化字符串中宽度规范后面。例如,"%10.5s" 指定打印输出的最大宽度为 5 个字符。
printArg 函数
printArg 函数根据格式化字符串中的宽度和精度规范对值进行处理。函数的执行流程如下:
- 检查值是否为 nil。如果值为 nil,则直接打印 "nil"。
- 根据值的类型调用相应的打印函数。
- 如果格式化字符串中指定了宽度规范,则在打印输出前面填充空格。
- 如果格式化字符串中指定了精度规范,则截断打印输出。
fmt 中的导出接口方法
fmt 包中定义了几个导出接口方法,包括 Fmt、Formatter 和 Stringer。这些接口方法允许自定义值的格式化输出。
Fmt 接口
Fmt 接口定义了 Format 方法,该方法接收一个 fmt.State 参数并返回一个字符串。Fmt 接口的目的是允许自定义值的格式化输出。例如,我们可以实现一个自定义的 Fmt 接口,为 slice 类型的值提供自定义的格式化输出。
Formatter 接口
Formatter 接口定义了 Format 方法,该方法接收一个 fmt.State 参数并返回一个错误。Formatter 接口的目的是允许自定义值的格式化输出,并可以处理错误。例如,我们可以实现一个自定义的 Formatter 接口,为文件对象提供自定义的格式化输出,并处理可能出现的错误。
Stringer 接口
Stringer 接口定义了 String 方法,该方法返回一个字符串。Stringer 接口的目的是允许自定义值的字符串化输出。例如,我们可以实现一个自定义的 Stringer 接口,为我们自己的类型提供自定义的字符串化输出。
调用位置
fmt 中的导出接口方法在以下位置被调用:
- %v 格式化说明符:调用 Fmt 接口的 Format 方法。
- %w 格式化说明符:调用 Formatter 接口的 Format 方法。
- %s 格式化说明符:调用 Stringer 接口的 String 方法。
总结
本文深入分析了 fmt.printArg 函数的宽度和精度处理部分,并探讨了 fmt 中导出接口方法的调用位置。通过自定义这些接口,我们可以自定义特定类型的值的格式化和打印输出。