你知道 golang 字符串格式化的这个用法吗?也许 90%的人不知道!快来看看这个输出结果是啥?

79 天前
 ashin

go 格式化输出,说说你的结果是啥?😁

fmt.Printf("%[2]d %[1]d\n", 11, 22)
fmt.Printf("%[3]*.[2]*[1]f\n", 12.0, 2, 6)
fmt.Printf("%d %d %#[1]x %#x\n", 16, 17) 

以上是 go 语言格式化输出中的显式参数索引用法。

了解 golang 格式化动词,请阅读全文:《 Golang 格式化输出完全指南:fmt.Printf 格式化动词用法详解,看这一篇就够了!》

1636 次点击
所在节点    推广
10 条回复
sunls
79 天前
这段 Go 语言代码的输出解释如下:

1. `fmt.Printf("%[2]d %[1]d\n", 11, 22)`:
- `%[2]d` 表示输出第 2 个参数 `22`。
- `%[1]d` 表示输出第 1 个参数 `11`。
- 输出结果是 `22 11`。

2. `fmt.Printf("%[3]*.[2]*[1]f\n", 12.0, 2, 6)`:
- `%[3]*.[2]*[1]f` 表示格式化浮点数,其中 `[3]` 是宽度,`[2]` 是小数位数,`[1]` 是浮点数值。
- 这里 `[3]` 是 `6`,宽度为 6 , `[2]` 是 `2`,小数位数为 2 ,`[1]` 是 `12.0`。
- 格式化结果是 ` 12.00`,输出时,前面有一个空格以保证总宽度为 6 。

3. `fmt.Printf("%d %d %#[1]x %#x\n", 16, 17)`:
- `%d` 输出整数 `16`。
- `%d` 输出整数 `17`。
- `%#[1]x` 输出第 1 个参数 `16` 的十六进制形式,前面有 `0x`,即 `0x10`。
- `%#x` 输出最后一个参数 `17` 的十六进制形式,前面有 `0x`,即 `0x11`。
- 输出结果是 `16 17 0x10 0x11`。


还有这种用法,学到了!
ashin
79 天前
@sunls 学习了
wWjd5V5L0636B5YV
79 天前
茴香?
bv
79 天前
这种索引取值的写法本来是参数复用的,例如:

```
fmt.Printf("%[1]s 和 %[1]s 的朋友们", "Tom")
```

但是 OP 举的例子不是很恰当:通过打乱顺序来说明用法,即没有把本质原因表现出来,也容易误导读者倾向于炫技。
ExplodingFKL
79 天前
文章不错,但帖子搞个这样的标题一眼引流让人没有点进来的欲望 ....
body007
79 天前
@bv 感谢大佬分享该用法,之前我多次用到某个值,就在参数写多次,这下方便多了👍
ninjashixuan
79 天前
还真没怎么关注过 fmt 新奇用法,稍微复杂一点都是自己用 strings.Builder 拼接。
ashin
79 天前
@bv 感谢,已接受建议修改原文示例:

```go
package main

import (
"fmt"
)

func main() {
// 使用索引进行参数复用
fmt.Printf("%[1]s 和 %[1]s 的朋友\n", "Tom")
// 输出 "Tom 和 Tom 的朋友"

fmt.Printf("%[2]d 是大于 %[1]d 的数字\n", 11, 22)
// 输出 "22 是大于 11 的数字"

// 展示使用 [n] 后,后面的动词自动递增
fmt.Printf("%d, %[3]d, %[1]d, %d, %d, %[1]d, %d\n", 100, 200, 300)
// 输出 "100, 300, 100, 200, 300, 100, 200"
}
```

这个示例展示了索引取值的几种用法:

- 使用 `[n]` 语法来复用同一个参数。
- 控制参数的选择和格式化方式。
- 在格式化字符串中,使用 `[n]` 语法后,后续的动词会自动递增,除非你再次指定索引。
ryalu
79 天前
满满的干货,整理的很用心,谢谢分享
ashin
79 天前
@ryalu 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1068928

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX