如何向Go语言的...interface{}类型参数追加值?
解决Go中Sprintf可变参数拼接的问题
嘿,我看到你遇到的问题了——你的Sprintf2函数输出被截断,没能正确拼接上猫的数量,对吧?让我来拆解一下问题根源,以及怎么修复它。
问题出在哪?
在你的Sprintf2函数里,这段代码是关键的错误点:
return fmt.Sprintf(format + " and %d cats", append(a, 5))
append(a, 5)返回的是一个[]interface{}类型的切片,但你直接把它传给fmt.Sprintf时,Go会把整个切片当作单个interface{}参数传入,而不是把切片里的元素逐个展开。这就导致格式化字符串里的%d %s能匹配原来的2和"dogs",但后面的and %d cats没有对应的参数,触发了格式化错误,所以输出被截断成了Now I w...。
怎么修复?
要让切片里的元素作为独立参数传入fmt.Sprintf,只需要在切片参数前加上...(展开运算符),这样Go就会把切片的每个元素拆成单独的参数传递。
修正后的完整代码
package main import "fmt" func main() { fmt.Println(fmt.Sprintf("Initially I want %d %s", 2, "dogs")) fmt.Println(Sprintf2("Now I want %d %s", 2, "dogs")) } func Sprintf2(format string, a ...interface{}) string { // 使用...展开append后的切片,将元素逐个传入 return fmt.Sprintf(format + " and %d cats", append(a, 5)...) }
运行结果
修正后运行这段代码,就能得到你预期的输出:
Initially I want 2 dogs Now I want 2 dogs and 5 cats
内容的提问来源于stack exchange,提问作者RAFJR
相关产品推荐
相关产品推荐

