2014-06-26 5 views
13

तो मेरे पास है:golang: परिवर्तित struct सूचक इंटरफेस करने {}

type foo struct{ 
    } 

    func bar(baz interface{}) { 
    } 

ऊपर पत्थर में सेट कर रहे हैं - मैं foo या बार बदल नहीं सकते। इसके अतिरिक्त, बाज़ को बार के अंदर एक foo struct पॉइंटर में परिवर्तित करना होगा। मैं & foo {} इंटरफ़ेस {} पर कैसे डालूं ताकि मैं बार को कॉल करते समय इसे पैरामीटर के रूप में उपयोग कर सकूं?

उत्तर

34

एक interface{} में *foo चालू करने के लिए मामूली बात है:

func bar(baz interface{}) { 
    f, ok := baz.(*foo) 
    if !ok { 
     // baz was not of type *foo. The assertion failed 
    } 

    // f is of type *foo 
} 

या एक type switch:

f := &foo{} 
bar(f) // every type implements interface{}. Nothing special required 

आदेश वापस एक *foo को पाने के लिए, आप एक type assertion कर सकते हैं या तो (समान, लेकिन उपयोगी अगर baz कई प्रकार हो सकते हैं):

func bar(baz interface{}) { 
    switch f := baz.(type) { 
    case *foo: // f is of type *foo 
    default: // f is some other type 
    } 
} 
+0

यदि आप इंटरफ़ेस के प्रकार को नहीं जानते हैं तो क्या होगा? आपके उदाहरण में 'बाज़' –

+5

@ जुंडेपारास: यदि आप नहीं जानते कि किस तरह के प्रकार' बाज़ 'हो सकते हैं, तो आपको प्रतिबिंब ('आयात" प्रतिबिंबित' ') के साथ काम करना होगा। इस प्रकार 'एन्कोडिंग/जेसन' जैसे पैकेज हाथ से पहले बिना किसी मूल रूप से किसी भी प्रकार को एन्कोड कर सकते हैं। – ANisus

+0

स्लाइस के साथ ऐसा करने का कोई तरीका है? – jocull

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