你知道 golang 字符串格式化的这个用法吗?也许 90%的人不知道!快来看看这个输出结果是啥? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ashin
V2EX    推广

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

  •  
  •   ashin 2024 年 8 月 30 日 2125 次点击
    这是一个创建于 502 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 格式化动词用法详解,看这一篇就够了!》

    10 条回复    2024-08-30 14:35:54 +08:00
    sunls
        1
    sunls  
       2024 年 8 月 30 日
    这段 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
        2
    ashin  
    OP
       2024 年 8 月 30 日
    @sunls 学习了
    wWjd5V5L0636B5YV
        3
    wWjd5V5L0636B5YV  
       2024 年 8 月 30 日
    茴香?
    bv
        4
    bv  
       2024 年 8 月 30 日   3
    这种索引取值的写法本来是参数复用的,例如:

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

    但是 OP 举的例子不是很恰当:通过打乱顺序来说明用法,即没有把本质原因表现出来,也容易误导读者倾向于炫技。
    ExplodingDragon
        5
    ExplodingDragon  
       2024 年 8 月 30 日
    文章不错,但帖子搞个这样的标题一眼引流让人没有点进来的欲望 ....
    body007
        6
    body007  
       2024 年 8 月 30 日
    @bv 感谢大佬分享该用法,之前我多次用到某个值,就在参数写多次,这下方便多了
    ninjashixuan
        7
    ninjashixuan  
       2024 年 8 月 30 日
    还真没怎么关注过 fmt 新奇用法,稍微复杂一点都是自己用 strings.Builder 拼接。
    ashin
        8
    ashin  
    OP
       2024 年 8 月 30 日
    @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]` 语法后,后续的动词会自动递增,除非你再次指定索引。
    ryan961
        9
    ryan961  
       2024 年 8 月 30 日
    满满的干货,整理的很用心,谢谢分享
    ashin
        10
    ashin  
    OP
       2024 年 8 月 30 日
    @ryalu 谢谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3879 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:51 PVG 08:51 LAX 16:51 JFK 19:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86