fmt.Sprintf 传递参数数组

问题描述 投票:0回答:5

很抱歉问这个基本问题。我想将一个切片作为参数传递给

fmt.Sprintf
。像这样的东西:

values := []string{"foo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)

结果会是

foobarbaz
,但这显然行不通。

(我想要格式化的字符串比这更复杂,所以简单的串联是不行的:)

所以问题是:如果我有 am 数组,如何将它作为单独的参数传递给

fmt.Sprintf
?或者:我可以在 Go 中调用传递参数列表的函数吗?

format go
5个回答
27
投票

正如您在 IRC 上发现的那样,这会起作用:

values := []interface{}{"foo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)

您的原始代码不起作用,因为

fmt.Sprintf
接受
[]interface{}
并且
[]string
无法隐式或显式转换为该类型。


4
投票

如果格式严格按照您的要求,那么接受的答案确实是正确的选择。

仅供参考,如果您只是出于日志目的而只是想打印它们,那么另一种方法是使用

%v

values := []string{"foo", "bar", "baz"}
result := fmt.Sprintf("%v", values)
fmt.Println(result)

结果:

[foo bar baz]

去游乐场:https://go.dev/play/p/_fZrT9mMmdb


1
投票

如果不使用数组,请使用

args ...any

package main

import "fmt"

func main() {
    format := "%d,%d: %s"

    check(format, 4, 5, "hello")
}

func check(format string, args ...any) {

    fmt.Printf(format, args...)
}

0
投票

如果就像连接数组值一样简单,可以选择使用

Join
函数:

func main() {
    values := []string{"one", "two", "three"}
    fmt.Println(strings.Join(values, ""))
}

如果更复杂,那么你可以有这样的功能:

func PrintValues(values []string) string {
    result := ""
    for _, val := range values {
        result = fmt.Sprintf("%s%s", result, val)
    }

    return result
}

func main() {
    values := []string{"one", "two", "three"}
    fmt.Println(PrintValues(values))
}

您可以在

for
循环中更改它的功能


-1
投票

我认为这样做的问题是 Sprintf 不能处理无限长度的切片,所以它不实用。格式参数的数量必须与格式化指令的数量相匹配。您要么必须将它们提取到局部变量中,要么编写一些内容来迭代切片并将字符串连接在一起。我会选择后者。

© www.soinside.com 2019 - 2024. All rights reserved.