2013-02-06 53 views
4

根據幾組帖子,下面的代碼應該工作:如何在Go中包裝var參數?

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 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) 

這是說,通過[]接口{}到需要...接口{}作爲自變量的函數展開爭論,而是簡單地將其作爲值。第一個%s將[] interface {}擴展爲一個字符串,並且不再處理任何參數。

我確定必須有很多情況下需要記錄這些;但我找不到任何有關如何做的實例。

這是基本的功能C.

回答

9

的「vprintf的家庭,我不覺得OP計劃應該「工作」。也許這是爲了代替(?):

package main 

import "fmt" 

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

func main() { 
     demo("%s %d\n\n", "Hello World", 10) 
     demo("%d %s", 10, "Hello") 
} 

(也here


輸出:

Hello World 10 

10 Hello 
+0

啊,謝謝對於下一個找不到這個的人來說,它隱藏在這裏作爲規範中的一個註釋:http://golang.org/ref/sp ec#Passing_arguments_to _..._參數 – Doug

+1

@Doug,[這也在「Effective Go」中解釋](http://golang.org/doc/effective_go.html#printing),這似乎是任何人都必須閱讀的新內容語言。 – kostix

3

fmt.Printf(format, args...)應該做你想要什麼,我覺得