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 等,除非另有指示。
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格式错误
所有错误都以字符串“%!”开头,有时后面跟着一个字符(动词),并以括号内的描述结尾。
//类型错误或动词未知:%!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是变量数 |
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 |
测试代码