golang格式化输入输出

fmt包使用类似于C的printf和scanf的函数实现格式化I/O

1输出格式化

一般的:

动词 效果 解释
%v [1 -23 3]、[1 -23 3]、&{sdlkjf 23} 以默认格式显示的值,与bool(%t)、int, int8 etc(%d)、uint, uint8 etc(%d)、float32, complex64, etc(%g)、string(%s)、chan(%p)、pointer(%p )等效
%+v [1 -23 3]、[1 -23 3]、&{Name:sdlkjf Age:23} 打印结构时添加字段名称
%#v [3]int{1, -23, 3}、[]int{1, -23, 3}、&main.Student{Name:"sdlkjf", Age:23} 值的 Go 语法表示(浮点无穷大和 NaN 打印为 ±Inf 和 NaN)
%T [3]int、[]int、*main.Student %T 值类型的 Go 语法表示
%% %%!(EXTRA int=1)、%%!(EXTRA [3]int=[1 -23 3])、%%!(EXTRA []int=[1 -23 3])、%%!(EXTRA *main.Student=&{sdlkjf 23}) 文字百分号;不消耗任何值

布尔:

动词 效果 解释
%t true、false 单词 true 或 false

整形:

动词 效果 解释
%d 5 6 7 8 -9 10 11 12 13 14 十进制
%+d +5 +6 +7 +8 -9 +10 +11 +12 +13 +14 显示正负号的十进制
%4d - 5 6 7 8 -9 10 11 12 13 14- 宽度为4,右对齐
%-4d -5 6 7 8 -9 10 11 12 13 14 - 宽度为4,左对齐
%b 101 110 111 1000 -1001 1010 1011 1100 1101 1110 二进制
%o 5 6 7 10 -11 12 13 14 15 16 八进制
%O 0o5 0o6 0o7 0o10 -0o11 0o12 0o13 0o14 0o15 0o16 前缀为 0o的八进制
%x 5 6 7 8 -9 a b c d e 十六进制,af 为小写字母
%X 5 6 7 8 -9 A B C D E 十六进制,AF 为大写字母
%U U+0005 U+0006 U+0007 U+0008 U+FFFFFFFFFFFFFFF7 U+000A U+000B U+000C U+000D U+000E Unicode 格式:U+1234;与"U+%04X"相同
%q '\x05' '\x06' '\a' '\b' '�' '\n' '\v' '\f' '\r' '\x0e' 使用 Go 语法安全转义的单引号字符文字
%c (输出为空,都是特殊字符) 相应 Unicode 代码点所表示的字符

浮点和复数:

动词 效果 解释
%f 2.230000 5.780000 有小数点但没有指数,例如 123.456
%.4f 2.2300 5.7800 有小数点但没有指数,精度为4
%9f - 2.230000 5.780000- 有小数点但没有指数,宽度为9,右对齐
%9f - 2.230000 5.780000- 有小数点但没有指数,宽度为9,右对齐
%9.f - 2 6- 有小数点但没有指数,宽度为9,右对齐,精度为0
%9.4f - 2.2300 5.7800- 有小数点但没有指数,宽度为9,右对齐,精度为4
%F 2.230000 5.780000 %F 与 %f 同义
%b 9353298p-22 6507701461550367p-50 无小数的科学计数法,指数为 2 的幂,与 strconv.FormatFloat 类似,但格式为 'b',例如 -123456p-78
%e 2.230000e+00 5.780000e+00 科学计数法,例如 -1.234456e+78
%E 2.230000E+00 5.780000E+00 科学计数法,例如 -1.234456E+78
%g 2.23 5.78 表示大指数,否则为 %f
%e 2.230000e+00 5.780000e+00 表示大指数,否则为 %f
%G 2.23 5.78 表示大指数,否则为 %F
%E 2.230000E+00 5.780000E+00 表示大指数,否则为 %F
%x 0x1.1d70a4p+01 0x1.71eb851eb851fp+02 十六进制计数法(指数为 2 的十进制幂),例如 -0x1.23abcp+20
%X 0X1.1D70A4P+01 0X1.71EB851EB851FP+02 大写十六进制计数法,例如 -0X1.23ABCP+20

字符串和字节切片:

动词 效果 解释
%s sdlkfjasdfja HelloWord 字符串或切片的未解释字节
%q "sdlkfjasdfja" "HelloWord" 使用 Go 语法安全转义的双引号字符串
%x 73646c6b666a617364666a61 48656c6c6f576f7264 以 16 为基数,小写,每个字节两个字符
%X 73646C6B666A617364666A61 48656C6C6F576F7264 %X 以 16 为基数,大写,每个字节两个字符
%p 0xc000092020 0xc000092030 以 16 进制表示的第 0 个元素的地址,以 0x 开头

指针:

动词 效果 解释
%p 0xc000092020 0xc000092030 以 16 为基数,以 0x 为前导
%b 1100000000000000000010010010000000100000 1100000000000000000010010010000000110000 二进制
%d 824634318880 824634318896 十进制
%o 14000002220040 14000002220060 八进制
%x c000092020 c000092030 十六进制小字母
%X C000092020 C000092030 十六进制大字母

其他标识:

动词 解释
'+' 总是为数值打印符号;保证 %q 仅输出 ASCII 格式(%+q)
'-' 在右侧而不是左侧填充空格(左对齐该字段)
'#' 为二进制添加前导 0b(%#b)、为八进制添加 0(%#o)、为十六进制添加 0x 或 0X(%#x 或 %#X);为 %p 隐藏 0x(%#p);对于 %q,如果 strconv.CanBackquote返回 true,则打印原始(反引号)字符串;总是为 %e、%E、%f、%F、%g 和 %G 打印小数点;不要删除 %g 和 %G 的尾随零;如果字符对 %U(%#U)可打印,则写入例如 U+0078 'x'' (空格)为数字中的省略符号留一个空格(% d);在打印字符串或十六进制切片的字节之间放置空格(%x,%X);没有备用十进制格式,因此 %#d 和 %d 的行为相同
'0' 用前导零而不是空格填充;对于数字,这会将填充移动到符号后

2显示参数索引

在Printf、Sprintf和Fprintf中,每个格式化动词的默认行为是格式化在调用中传递的连续参数。但是,动词前面的符号 [n] 表示将格式化第 n 个 1 索引的参数。宽度或精度的 '*' 之前的相同符号选择保存该值的参数索引。在处理括号表达式 [n] 之后,后续动词将使用参数 n+1、n+2 等,除非另有指示。

c 复制代码
fmt.Sprintf("%[2]d %[1]d\n", 11, 22)
//22 11

//下面这两个等效
fmt.Printf("%[3]*.[2]*[1]f\n", 12.0, 2, 6)
fmt.Printf("%6.2f\n", 12.0)
//12.00
//12.00

3格式错误

所有错误都以字符串"%!"开头,有时后面跟着一个字符(动词),并以括号内的描述结尾。

cpp 复制代码
//类型错误或动词未知:%!verb(type=value)
fmt.Printf("%d", "hi")
fmt.Println()
//%!d(string=hi)

//参数太多:%!(EXTRA type=value)
fmt.Printf("hi", "guys")
fmt.Println()
//hi%!(EXTRA string=guys)

//参数太少:%!verb(MISSING)
fmt.Printf("hi%d\n")
fmt.Println()
//hi%!d(MISSING)

//宽度或精度非整数:%!(BADWIDTH) 或 %!(BADWIDTH)
fmt.Printf("%*s", 4.5, "hi")
fmt.Println()
//%!(BADWIDTH)hi
fmt.Printf("%.*s", 4.5, "hi")
fmt.Println()
//%!(BADPREC)hi

//参数索引无效或使用不正确:%!(BADINDEX)
fmt.Printf("%*[2]d", 7)
fmt.Println()
//%!d(BADINDEX)
fmt.Printf("%.[2]d", 7)
fmt.Println()
//%!d(BADINDEX)

4输入输出

函数名 参数 返回值 解释
Fprint w io.Writer, a ...any n int, err error Fprintf 根据格式说明符格式化并写入 w。它返回写入的字节数和遇到的任何写入错误。
Fprintf w io.Writer, format string, a ...any n int, err error Fprintf 根据格式说明符格式化并写入 w。它返回写入的字节数和遇到的任何写入错误。
Fprintln w io.Writer, a ...any n int, err error Fprintln 使用其操作数的默认格式进行格式化并写入 w。操作数之间始终添加空格并附加换行符。它返回写入的字节数和遇到的任何写入错误。
Fscan r io.Reader, a ...any n int, err error Fscan 扫描从 r 读取的文本,将连续的空格分隔值存储到连续的参数中。换行符算作空格。它返回成功扫描的项目数。如果该数量小于参数数量,err 将报告原因。
Fscanf r io.Reader, a ...any n int, err error n int , err error
Fscanln r io . Reader , a ... any n int , err error Fscanln 与Fscan类似,但在换行符处停止扫描,并且在最后一项之后必须有一个换行符或 EOF。返回值n是变量数
Fscanln r io . Reader , a ... any n int , err error Fscanln 与Fscan类似,但在换行符处停止扫描,并且在最后一项之后必须有一个换行符或 EOF。返回值n是变量数
Print a ... any n int,err error 使用默认格式打印其操作数的格式并写入标准输出。当操作数都不是字符串时,会在操作数之间添加空格。它返回写入的字节数和遇到的任何写入错误。
Println a ... any n int,err error Println 使用其操作数的默认格式进行格式化并写入标准输出。操作数之间始终添加空格并附加换行符。它返回写入的字节数和遇到的任何写入错误。
Scan a ... any n int,err error Scan 扫描从标准输入读取的文本,将连续的空格分隔值存储到连续的参数中。换行符算作空格。它返回成功扫描的项目数。如果该数量小于参数数量,err 将报告原因。
Scanf format string, a ...any n int, err error Scanf 扫描从标准输入读取的文本,将连续的空格分隔值存储到由格式确定的连续参数中。它返回成功扫描的项目数。如果该数量小于参数数量,err 将报告原因。输入中的换行符必须与格式中的换行符匹配。一个例外:动词 %c 始终扫描输入中的下一个符文,即使它是空格(或制表符等)或换行符。
Scanln a ...any n int, err error Scanln 与Scan类似,但在换行符处停止扫描,并且在最后一项之后必须有一个换行符或 EOF。
Sprint a ...any string Sprintf 根据格式说明符进行格式化并返回结果字符串。
Sprintf format string, a ...any string Sprintf 根据格式说明符进行格式化并返回结果字符串。
Sprintln a ...any string Sprintln 使用其操作数的默认格式进行格式化并返回结果字符串。操作数之间始终添加空格并附加换行符。
Sscan str string , a ... any n int , err error Sscan 扫描参数字符串,将连续的空格分隔值存储到连续的参数中。换行符算作空格。它返回成功扫描的项目数。如果该数量小于参数数量,err 将报告原因。
Sscanf str string, format string, a ...any n int , err error Sscanf 扫描参数字符串,将连续的空格分隔值存储到由格式确定的连续参数中。它返回成功解析的项目数。输入中的换行符必须与格式中的换行符匹配。
Sscanf str string, format string, a ...any n int , err error Sscanf 扫描参数字符串,将连续的空格分隔值存储到由格式确定的连续参数中。它返回成功解析的项目数。输入中的换行符必须与格式中的换行符匹配。
Sscanln str string,a ... any n int , err error Sscanln 与Sscan类似,但在换行符处停止扫描,并且在最后一项之后必须有一个换行符或 EOF。
Format f State , verb runey - 该实现控制如何解释State和 rune,并可能调用Sprint或Fprint (f) 等来生成其输出。
GoStringer - string 该方法定义该值的 Go 语法。GoString 方法用于打印作为操作数传递给 %#v 格式的
ReadRune - r rune , size int , err error ReadRune 从输入中读取下一个符文(Unicode 代码点)。 如果在 Scanln、Fscanln 或 Sscanln 期间调用,ReadRune() 将在返回第一个 '\n' 或读取超出指定宽度后返回 EOF。
UnreadRune - error 导致下一次调用ReadRune返回相同的符文。
SkipSpace - - SkipSpace跳过输入中的空格。新线路得到适当处理,用于正在执行的操作;请参阅软件包文档,了解更多信息。
Token skipSpace bool, f func(rune) bool token []byte, err error 如果skipSpace为真,则Token跳过输入中的空格,然后返回满足f©的Unicode码点c的运行。如果f为零!unicode。使用IsSpace©;也就是说,令牌将包含非空格字符。对新管线进行适当处理,以适应正在进行的操作;有关更多信息,请参阅软件包文档。返回的切片指向共享数据,这些数据可能会被下一次调用Token、使用ScanState作为输入调用Scan函数或调用Scan方法返回时覆盖。
Width - wid int, ok bool Width返回宽度选项的值以及是否已设置。单位是Unicode码位。
Read buf []byte n int, err error 因为ReadRune是由接口实现的,所以扫描例程永远不应该调用Read,有效的ScanState实现可能会选择始终从Read返回错误。
Scan state ScanState, verb rune error Scanner 由具有 Scan 方法的任何值实现,该方法扫描输入以查找值的表示形式并将结果存储在接收器中,接收器必须是指针才有用。对于实现它的Scan、Scanf或Scanln的任何参数,都会调用 Scan 方法。
Write b []byte n int, err error Write是调用以发出要打印的格式化输出的函数。
Width - wid int, ok bool Width返回宽度选项的值以及是否已设置。
Precision - prec int, ok bool Precision返回精度选项的值以及是否已设置。
Flag c int bool Flag报告是否已设置标志c(一个字符)。
String - string

测试代码

相关推荐
小周同学:8 分钟前
在 Vue2 中使用 pdf.js + pdf-lib 实现 PDF 预览、手写签名、文字批注与高保真导出
开发语言·前端·javascript·vue.js·pdf
teeeeeeemo1 小时前
跨域及解决方案
开发语言·前端·javascript·笔记
uhakadotcom1 小时前
使用postgresql时有哪些简单有用的最佳实践
后端·面试·github
IT毕设实战小研1 小时前
基于Spring Boot校园二手交易平台系统设计与实现 二手交易系统 交易平台小程序
java·数据库·vue.js·spring boot·后端·小程序·课程设计
bobz9651 小时前
QT 字体
后端
泉城老铁1 小时前
Spring Boot 中根据 Word 模板导出包含表格、图表等复杂格式的文档
java·后端
用户4099322502121 小时前
如何在FastAPI中玩转APScheduler,实现动态定时任务的魔法?
后端·github·trae
极客BIM工作室1 小时前
谈谈《More Effective C++》的条款30:代理类
java·开发语言·c++
风象南1 小时前
开发者必备工具:用 SpringBoot 构建轻量级日志查看器,省时又省力
后端
RainbowSea2 小时前
伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 04
java·spring boot·后端