2012-09-08 12 views
20

मैं सरल fmt.Fprintf आवरण है जो यहाँ तर्कों की चर संख्या लेता है, लिखने के लिए कोशिश कर रहा हूँ कोड है:जाओ - variadic कार्यों मापदंडों पास-थ्रू

func Die(format string, args ...interface{}) { 
    str := fmt.Sprintf(format, args) 
    fmt.Fprintf(os.Stderr, "%v\n", str) 
    os.Exit(1) 
} 

लेकिन जब मैंने उसे फोन कर रहा हूँ:

Die("foo")

मैं:

foo%!(EXTRA []interface {}=[])

यह नहीं समझ सकता कि मुझे "foo" & के बाद यह टेक्स्ट क्यों मिल रहा है fmt.Fprintf के आसपास रैपर बनाने का सही तरीका क्या है?

+3

बीटीडब्ल्यू, डाई फ़ंक्शन पुन: लागू करता है [log.Fatal] (http://golang.org/pkg/log/#Fatal) और/या [log.Logger.Fatalf] (http: // golang। संगठन/पीकेजी/लॉग/# लॉगर.फतालएफ) के लिए तैयार हैं। – zzzz

उत्तर

35

वैराडिक फ़ंक्शंस प्रकार के टुकड़े के रूप में तर्क प्राप्त करते हैं। इस मामले में आपके फ़ंक्शन को []interface{} नाम args प्राप्त होता है। जब आप fmt.Sprintf पर उस तर्क को पास करते हैं, तो आप इसे []interface{} प्रकार के एक तर्क के रूप में पास कर रहे हैं। आप वास्तव में क्या चाहते हैं args में एक अलग तर्क के रूप में प्रत्येक मान को पास करना है (वैसे ही आपको उन्हें प्राप्त हुआ)। ऐसा करने के लिए आपको ... वाक्यविन्यास का उपयोग करना होगा।

str := fmt.Sprintf(format, args...) 

यह भी जाओ विनिर्देश here से समझाया गया है।

संबंधित मुद्दे