如何动态地将值传递给Sprintf或Printf

时间:2017-02-17 21:55:54

标签: go printf

如果我想填充一个字符串,我可以使用这样的东西:

https://play.golang.org/p/ATeUhSP18N

package main

import (
    "fmt"
)

func main() {
    x := fmt.Sprintf("%+20s", "Hello World!")
    fmt.Println(x)
}

来自https://golang.org/pkg/fmt/

 +  always print a sign for numeric values; 
    guarantee ASCII-only output for %q (%+q)
 -  pad with spaces on the right rather than the left (left-justify the field)

但如果我想动态更改打击垫大小,我怎么能传递该值?

我的第一位客人是:

x := fmt.Sprintf("%+%ds", 20, "Hello World!")

但我明白了:

%ds%!(EXTRA int=20, string=Hello World!)

有没有办法在不创建自定义填充函数的情况下执行此操作,可能会使用for循环向左或向右添加空格:

for i := 0; i < n; i++ {
    out += str
}

2 个答案:

答案 0 :(得分:9)

使用*告诉Sprintf从参数列表中获取格式参数:

fmt.Printf("%*s\n", 20, "Hello World!")

Full code on play.golang.org

答案 1 :(得分:5)

转到:https://golang.org/pkg/fmt/ 然后向下滚动,直到找到:

fmt.Sprintf("%[3]*.[2]*[1]f", 12.0, 2, 6)
     

相当于

fmt.Sprintf("%6.2f", 12.0)
     

会产生&#34; 12.00&#34 ;.因为显式索引会影响后续动词,   此表示法可用于多次打印相同的值   重置要重复的第一个参数的索引

这听起来像你想要的。

使用参数设置字段宽度和精度的描述的真正核心在上面进一步说明:

  

宽度和精度是以Unicode代码点为单位测量的   是,符文。 (这与C&C的printf不同,其中单位总是如此   以字节为单位测量。)其中一个或两个标志可以替换为   字符&#39; *&#39;,导致他们的值从下一个获得   操作数,必须是int类型。

上面的例子只是在参数列表中使用显式索引,这有时很好,并且允许您重复使用相同的宽度和精度值来进行更多转换。

所以你也可以写:

    fmt.Sprintf("*.*f", 6, 2, 12.0)