猿问

如何在Go中包装var args?

根据几个小组的帖子,以下代码应该起作用:


package main


import "fmt"


func demo(format string, args ...interface{}) {

  var count = len(args)

  for i := 0; i < count; i++ {

    fmt.Printf("! %s\n", args[i])

  }

  fmt.Printf("%+v\n", format)

  fmt.Printf("%+v\n", args)

  fmt.Printf(format, args)

  fmt.Printf("\n")

}


func main() {

  demo("%s %d", "Hello World", 10)

  fmt.Printf("\n\n")

  demo("%d %s", 10, "Hello")

}

并生成“ Hello World 10”和“ 10 Hello”,但事实并非如此。相反,它产生:


! Hello World

! %!s(int=10)

%s %d

[Hello World 10]

[Hello World %!s(int=10)] %d(MISSING)



! %!s(int=10)

! Hello

%d %s

[10 Hello]

[10 %!d(string=Hello)] %s(MISSING)

也就是说,将[] interface {}传递给以... interface {}作为参数的函数不会扩展参数,而只是将其作为值传递。第一个 %s 将 []interface{} 扩展为字符串,不再处理其他参数。


我敢肯定,在很多情况下,日志记录都需要这样做;但我找不到任何可行的示例。


这基本上是C语言中的'vprintf'函数族。


月关宝盒
浏览 192回答 2
2回答

慕无忌1623718

fmt.Printf(format, args...)&nbsp;应该做我想做的事。
随时随地看视频慕课网APP

相关分类

Go
我要回答