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

测试代码

相关推荐
何曾参静谧几秒前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
q5673152327 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
许野平1 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨1 小时前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
blammmp2 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong2 小时前
Java反射
java·开发语言·反射
Troc_wangpeng2 小时前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习