格式化输出小汇
1 简介
包 fmt 实现格式化的 I/O,其功能类似于 到 C 的 printf 和 scanf。格式 ‘verbs’ 派生自 C 但 更简单。
2 常见格式形式
- 常规:
%v 默认格式的值
打印结构时,加号标志 (% v) 会添加字段名称
%#v Go 语法表示值
(浮点无穷大和 NaN 打印为 ±Inf 和 NaN)
%T Go 语法表示形式的值类型
%% 文本百分号;不消耗任何值
- 布尔:
%t 字符 true 或 false
- 整数:
%b 以 2进制 为基
%c 相应的 Unicode 码位表示的字符
%d 10进制
%o 8进制
%O 8进制,前缀为 0o
%q 使用 Go 语法安全转义的单引号字符文本。
%x 16 进制,a-f 为小写字母
%X 16 进制,大写字母 A-F
%U Unicode 格式 U+1234; 类似 “U+%04X”
- 浮点和复数成分:
%b 指数为 2 的幂的无十进制科学记数法,
以 strconv 的方式。FormatFloat 替换为 ‘b’ 格式,
例如 -123456P-78
%e 科学记数法,例如 -1.234456e 78
%E 科学记数法,例如 -1.234456E 78
%f 小数点,但没有指数,例如 123.456
%F %f的同义词
%g %e 表示大指数,否则为 %f。精度将在下面讨论。
%G %E 表示大指数,否则为 %F
%x 十六进制表示法(十进制幂为 2 指数),例如 -0x1.23abcp 20
%X 大写十六进制表示法,例如 -0X1.23ABCP 20
指数始终为十进制整数。
对于 %b 以外的格式,指数至少为两位数。
字符串和字节片(与这些动词等效处理):
%s 字符串或 slice 的未解释字节
%q 使用 Go 语法安全转义的双引号字符串
%x 基数 16,小写,每字节 2 个字符
%X 基数为 16,大写,每字节 2 个字符
- 切片:
%p 以 16进制的第 0 个元素的地址,前导 0x
- 指针:
%p 以 16进制的表示法,带前导 0x
%b、%d、%o、%x 和 %X 动词也适用于指针,将值的格式完全设置为整数。
%v 的默认格式如下:
bool: %t
int, int8 etc.: %d
uint, uint8 etc.: %d, %#x if printed with %#v
float32, complex64, etc: %g
string: %s
chan: %p
pointer: %p
对于复合对象,元素使用这些规则递归打印, 布局如下:
struct: {field0 field1 ...}
array, slice: [elem0 elem1 ...]
maps: map[key1:value1 key2:value2 ...]
pointer to above: &{}, &[], &map[]
Width 由紧跟在动词前面的可选十进制数指定。 如果不存在,则 width 是表示值所需的任何宽度。 精度在(可选)宽度后指定一个句点,后跟一个 十进制数。如果不存在句点,则使用默认精度。 没有后跟数字的句点指定精度为零。 例子:
%f 默认宽度、默认精度
%9f 默认宽度9位
%.2f 默认宽度,精度 2
%9.2f 宽度 9,精度 2
%9.f 宽度 9,精度 0
宽度和精度以 Unicode 码位为单位进行测量, 也就是说,符文。(这与 C 的 printf 不同,其中 单位始终以字节为单位。
一个或两个标志 可以替换为字符 ‘*’,导致它们的值为 从下一个作数(在 to format 之前)获取, 它必须是 int 类型。
对于大多数值, width 是要输出的最小符文数, 如有必要,用空格填充格式化的表单。
但是,对于字符串、字节切片和字节数组,精度 限制要格式化的输入的长度(而不是 output),必要时截断。通常它以 runes 的 SET 文件,但对于使用 %x 或 %X 格式格式化的这些类型 它以字节为单位。
对于浮点值,width 设置字段的最小宽度, precision 设置小数点后的位数(如果合适), 除了 %g/%G 精度设置最大有效数 digits (删除尾随零)。例如,给定 12.345 格式 %6.3f 打印 12.345,而 %.3g 打印 12.3。%e 的默认精度,%f %#g 为 6;对于 %g,它是标识所需的最小位数 值的唯一值。
对于复数,宽度和精度适用于两者 组件,并且结果被括起来,因此应用 %f 到 1.2+3.4i 产生 (1.200000+3.400000i)。
格式化单个整数代码点或 rune 字符串时(键入 []rune) 使用 %q,无效的 Unicode 代码点将更改为 Unicode 替换 字符,U+FFFD,如 strconv 中所示。引用符文。
-
其他标志:
‘+’ 始终为数值打印一个符号;
保证 %q (% q) 为仅 ASCII 输出
‘-’ 填充右侧而不是左侧的空格(左对齐字段)
‘#’ 备用格式:为二进制 (%#b) 添加前导 0b,为八进制 (%#o) 添加前导 0b,
0x 或 0X 表示十六进制(%#x 或 %#X);抑制 %p 的 0x (%#p);
对于 %q,以下场景打印原始(反引号)字符串:如果 [strconv.CanBackquote]
返回值为 true;
始终为 %e、%E、%f、%F、%g 和 %G 打印一个小数点;
不删除 %g 和 %G 的尾随零;
例如,如果 'x’字符可打印 %U (%#U),则写入. U+0078
’ ’ (空格) 为省略的符号留出一个空格 (% d);
在十六进制打印字符串或切片的字节之间添加空格 (% X, % X)
‘0’ 填充前导零而不是空格;
对于 Numbers,这会将填充移动到符号之后。
标志被不需要它们的动词忽略。 例如,没有备用十进制格式,因此 %#d 和 %d 行为相同。
对于每个类似 Printf 的函数,还有一个 Print 函数 这不需要任何格式,相当于为每个 操作数。另一种变体 Println 在 作数并附加一个换行符。
3 扫描
一组类似的函数扫描格式化文本以生成 值。Scan、Scanf 和 Scanln 从 os 读取。
Fscan、Fscanf 和 Fscanln 从指定的 io 中读取。读者;Sscan、Sscanf 和 Sscanln 从参数字符串中读取。
Scan、Fscan、Sscan 将输入中的换行符视为空格。
Scanln、Fscanln 和 Sscanln 在换行符处停止扫描,并且 要求项目后跟换行符或 EOF。
Scanf、Fscanf 和 Sscanf 根据 format 字符串,类似于 Printf 的字符串。在文本中 之后,“space”表示任何 Unicode 空白字符 除了 newline 之外。
4 示例
//bool: %t
//int, int8 etc.: %d
//uint, uint8 etc.: %d, %#x if printed with %#v
//float32, complex64, etc: %g
//string: %s
//chan: %p
//pointer: %p
//binary %b
func main() {
fmt.Printf("%d - %b \n", 42, 42)
fmt.Printf("%d - \n",52)
// fmt.Printf("%d - %b - %x \n", 42, 42, 42)
// fmt.Printf("%d - %b - %#x \n", 42, 42, 42)
// fmt.Printf("%d - %b - %#X \n", 42, 42, 42)
fmt.Printf("%d \t %b \t %#X \t %v \t %#v \n", 42, 42, 42, 42, 42)
var c = make(chan string, 1)
c <- "test"
fmt.Printf("P:%p\n", c)
fmt.Printf("R:%#v V:%v\n", c, <-c)
}
如上例,数字 42 在不同格式要求下的输出不一样
%d 整数 %b 二进制 %#X 16进制 %v 默认值
42 101010 0X2A 42
42
P:0xc0000b0000 指针的16进制的test表示,有前缀 0x
R:(chan string)(0xc0000b0000) V:test 通道的默认形式和 其中取出的值
- 点赞
- 收藏
- 关注作者
评论(0)