2014-06-20 8 views
18

तो जैसे एक struct को देखते हुए पर प्रतिबिंब:golang - एम्बेडेड structs

type B struct { 
    X string 
    Y string 
} 

type D struct { 
    B 
    Z string 
} 

मैं डी पर विचार करने और करने के लिए खेतों एक्स प्राप्त करना चाहते हैं, वाई, जेड

Intuitively, समाधान प्रयास करने से पहले, मैं मान रहा था कि मैं संरचना डी को पार करने और प्रतिबिंब (एक्स, वाई, जेड) का उपयोग करके सभी क्षेत्रों को प्राप्त करने में सक्षम होगा और बी

से निपटने के लिए नहीं होगा, लेकिन जैसा कि आप देख सकते हैं, मैं केवल एम्बेडेड देखता हूं प्रतिबिंब का उपयोग कर संरचना बी और इसके खेतों में नहीं।

http://play.golang.org/p/qZQD5GdTA8

वहाँ एक रास्ता जब डी को दर्शाती मैं बी पूरी तरह से पारदर्शी बना सकते हैं है?

मुझे यह क्यों चाहिए?

एक सामान्य संरचना इमेजिंग (यहां उदाहरण में बी), जिसे एम्बेडिंग का उपयोग करके कई अन्य structs में उपयोग किया जाता है। प्रतिबिंब का उपयोग करके, डी को एक अलग पैकेज में डी को दूसरी समान संरचना में कॉपी करना है। प्रतिलिपि बनाने के लिए गंतव्य संरचना में सभी विशेषताओं को स्पष्ट रूप से रखा जाएगा (वहां कोई एम्बेडिंग नहीं है)। इसलिए स्रोत से गंतव्य तक एक मेल नहीं है (एम्बेडेड बनाम कोई एम्बेडिंग नहीं) लेकिन सभी विशेषताओं को स्पष्ट रूप से रखा गया है। मैं प्रत्येक संरचना के लिए कस्टम समाधान नहीं बनाना चाहता हूं।

उत्तर

15

आपको अपेक्षित 'पारदर्शिता' केवल वाक्य रचनात्मक चीनी है और डेटा प्रतिनिधित्व के साथ इसका कोई लेना-देना नहीं है। यदि आप एक ऐसा फ़ंक्शन रखना चाहते हैं जो आपकी डेटा संरचना को फ़्लैट करता है, तो आपको इसे स्वयं लिखना होगा।

उदाहरण (On play) के लिए: यदि क्षेत्र में यह समतल से पहले अंतर्निहित है

func DeepFields(iface interface{}) []reflect.Value { 
    fields := make([]reflect.Value, 0) 
    ifv := reflect.ValueOf(iface) 
    ift := reflect.TypeOf(iface) 

    for i := 0; i < ift.NumField(); i++ { 
     v := ifv.Field(i) 

     switch v.Kind() { 
     case reflect.Struct: 
      fields = append(fields, DeepFields(v.Interface())...) 
     default: 
      fields = append(fields, v) 
     } 
    } 

    return fields 
} 
+2

शायद आप की जाँच करनी चाहिए अगर यह 'पारदर्शिता' ओपी उम्मीद कर रही है अनुकरण करने के लिए है? यानी '' यदि v.Kind() == प्रतिबिंबित करें। संरचना && v. अनामित '' ' – themihai