fmt.Sprintf passing an array of arguments
Sorry for the basic question. I'd like to pass a slice as arguments to fmt.Sprintf
. Something like this:
values := []string{"开发者_如何学Gofoo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)
And the result would be foobarbaz
, but this obviously doesn't work.
(the string I want to format is more complicated than that, so a simple concatenation won't do it :)
So the question is: if I have am array, how can I pass it as separated arguments to fmt.Sprintf
? Or: can I call a function passing an list of arguments in Go?
As you found out on IRC, this will work:
values := []interface{}{"foo", "bar", "baz"}
result := fmt.Sprintf("%s%s%s", values...)
Your original code doesn't work because fmt.Sprintf
accepts a []interface{}
and []string
can't be converted to that type, implicitly or explicitly.
If the format is strictly like what you asked, then the accepted answer is indeed the way to go.
Fyi, if it is for logging purposes where you simply want to print them, then another way is by using %v
values := []string{"foo", "bar", "baz"}
result := fmt.Sprintf("%v", values)
fmt.Println(result)
result:
[foo bar baz]
Go playground: https://go.dev/play/p/_fZrT9mMmdb
if not use array, use 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...)
}
I think the issue with doing this is that the Sprintf won't work with unbounded length slices, so it's not practical. The number of format parameters must match the number of formatting directives. You will either have to extract them into local variables or write something to iterate the slice and concatenate the strings together. I'd go for the latter.
精彩评论