2015-09-04 6 views
5

मुझे प्रलेखन में यह प्रतीत नहीं होता है, क्या कोई गारंटी है कि फ़ील्ड का ऑर्डर स्ट्रक्चर में घोषित ऑर्डर से मेल खाता है? मुझे पता है ऐसा लगता है कि यह तर्कसंगत रूप से (मेमोरी लेआउट के कारण) होगा, और ऐसा लगता है कि यह भी इस तरह से प्रदर्शन करता है, लेकिन बस सुनिश्चित कर रहा है। मैं कोड को बाद में तोड़ना नहीं चाहता हूं अगर यह गारंटी नहीं है।टाइप करें। फ़ील्ड() ऑर्डर

उदाहरण के लिए, अगर मैं

type Foo struct { 
    bar string `tag:"bar"` 
    baz string `tag:"baz"` 
    barbaz string `tag:"barbaz"` 
} 

था और मैं इस कोड भाग गया:

var c Foo 
t := reflect.TypeOf(c) 
nf := t.NumField() 

tags := make([]string, nf) 

for f := 0; f < nf; f++ { 
    tags[f] = t.Field(f).Tag.Get("tag") 
} 

चाहेंगे ["bar", "baz", "barbaz"] होने की गारंटी दी जा tags?

+1

क्या [Value.FieldByName] (https://golang.org/pkg/reflect/#Value.FieldByName) आपके मामले में सहायता करेगा? –

+0

मैं सिर्फ कुछ के लिए टैग नाम चाहता था, यह मुझे आलसी प्रोग्रामर होने और थोड़ा कम कोडिंग करने की कोशिश कर रहा था (जो हमेशा एक टन में अधिक काम करता है)। मुझे नहीं पता कि मैं अब उस विधि से चिपकने जा रहा हूं, अब मैं जवाब में थोड़ी दिलचस्पी रखता हूं। – user3591723

+0

भले ही जीसी (मानक गो कंपाइलर) और जीसीसीजीओ संरचना क्षेत्रों को दोबारा नहीं बनाते हैं, मैं किसी ऑर्डरिंग पर भरोसा नहीं करता हूं। दस्तावेज में कोई स्पष्ट गारंटी नहीं है। – thwd

उत्तर

3

भले ही जीसी (मानक गो कंपाइलर) और जीसीसीजीओ आज संरचना क्षेत्रों को फिर से नहीं चलाएंगे, मैं किसी ऑर्डरिंग पर भरोसा नहीं करता। दस्तावेज में कोई स्पष्ट गारंटी नहीं है। यह या तो कंपाइलर के भविष्य के संस्करण में किया जा सकता है।

फ़ील्ड रीडरिंग एक ऐसी तकनीक है जो पैडिंग का उपयोग किए बिना संरचना के अंदर फ़ील्ड को स्मृति-संरेखित करने के लिए उपयोग की जाती है (अनावश्यक रूप से संरचना की स्मृति प्रस्तुति को बढ़ाती है)। आप निम्नलिखित प्रश्न में इसके बारे में पढ़ सकते हैं:

Why can't C compilers rearrange struct members to eliminate alignment padding?

+0

मैं यह जोड़ना चाहता हूं कि यह बहुत ही असंभव है क्योंकि इससे उस स्मृति संरेखण पर निर्भर कई चीजें तोड़ जाएंगी लेकिन आप अभी भी सही हैं। – OneOfOne

1

मैं golang-पागल इस बारे में पूछा, और यह की घोषणा के क्रम की पुष्टि an answer from Ian Lance Taylor हो गया, और नहीं बदलेगा।

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