`fmt`包的函数是否支持数组的格式化程序?

时间:2016-01-22 17:19:04

标签: serialization go

我正在尝试提交一个包含多个参数的电子邮件,我在一个单独的文件中有一些打印动词的电子邮件,但由于动词太多,我最终会得到这样的一行:

message := fmt.Sprintf(util.CONTACT_EMAIL, form.Name, form.Email, form.Email,     form.Phone, form.Phone, form.Message, ...)

它只是继续,看起来很糟糕。我重复一些动词的原因是获得href,例如<a href"mailto:%s">%s</a>,等等。如果有人有更好的方法,我真的很想知道。

但是关于我的问题.. Go是否有类似于的格式化程序 PHP中的vsprintf?它基本上将一个数组作为参数,所以它就像:

string vsprintf(string $format , array $args) 

..而不是我上面的混乱,这使它更具可读性。

我查看了文档,但似乎没有看到任何内容......但是Go所做的很多事情对我来说仍然是陌生的,所以也许我忽略了它。

1 个答案:

答案 0 :(得分:1)

如果你只想将一片参数传递给fmt.Sprintf(或任何其他带有可变数量参数的函数),你可以这样做:

func main() {
    s := []interface{}{1,2,5}
    z := fmt.Sprintf("%d, %d, %d", s...)
    print(z)
}

或者如果你有一些不是空接口的片段,我们必须将它复制到空接口的一个片段中:

func main() {
    s := []int{1,2,5}

    // we need to copy each element one-by-one into a []interface{} 
    // because they are laid out differently in memory in go.
    var x []interface{}
    for _, i := range s {
        x = append(x, i)
    }

    // pass the contents of the new slice into sprintf
    z := fmt.Sprintf("%d, %d, %d", x...)
    print(z)
}