V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ashin
V2EX  ›  推广

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

  •  
  •   ashin · 79 天前 · 1636 次点击
    这是一个创建于 79 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       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
        2
    ashin  
    OP
       79 天前
    @sunls 学习了
    wWjd5V5L0636B5YV
        3
    wWjd5V5L0636B5YV  
       79 天前
    茴香?
    bv
        4
    bv  
       79 天前   ❤️ 3
    这种索引取值的写法本来是参数复用的,例如:

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

    但是 OP 举的例子不是很恰当:通过打乱顺序来说明用法,即没有把本质原因表现出来,也容易误导读者倾向于炫技。
    ExplodingFKL
        5
    ExplodingFKL  
       79 天前
    文章不错,但帖子搞个这样的标题一眼引流让人没有点进来的欲望 ....
    body007
        6
    body007  
       79 天前
    @bv 感谢大佬分享该用法,之前我多次用到某个值,就在参数写多次,这下方便多了👍
    ninjashixuan
        7
    ninjashixuan  
       79 天前
    还真没怎么关注过 fmt 新奇用法,稍微复杂一点都是自己用 strings.Builder 拼接。
    ashin
        8
    ashin  
    OP
       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
        9
    ryalu  
       79 天前
    满满的干货,整理的很用心,谢谢分享
    ashin
        10
    ashin  
    OP
       79 天前
    @ryalu 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2789 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 08:31 · PVG 16:31 · LAX 00:31 · JFK 03:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.