2013-11-23 6 views
5

पृष्ठभूमिएम्बेडेड विधियों "पैरेंट" फ़ील्ड तक पहुंच सकते हैं?

मैं कल्पना पढ़ने और कोड परीक्षण भी पर्याप्त मात्रा में किया है और मुझे लगता है कि जवाब नहीं है, लेकिन मुझे यकीन है कि मैं कुछ भी याद आ रही नहीं कर रहा हूँ बनाना चाहते हैं।

लक्ष्य

असल में, मैं, क्योंकि मुझे पसंद है कि यह कैसे पठनीय है जाओ के लिए एक सक्रिय रिकॉर्ड शैली ORM बनाने के लिए कोशिश कर रहा हूँ और कैसे निकाला गया यह अपनी पीठ अंत डेटा की दुकान से है। मैं उपयोगकर्ता संरचना पर सामान्य CRUD विधियों को एम्बेड करके user.Save()data.Save(user) लिखना चाहता हूं।

उदाहरण

package main 

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    test := Foo{Bar: &Bar{}, Name: "name"} 
    test.Test() 
} 

type Foo struct { 
    *Bar 
    Name string 
} 

func (s *Foo) Method() { 
    fmt.Println("Foo.Method()") 
} 

type Bar struct { 
} 

func (s *Bar) Test() { 
    t := reflect.TypeOf(s) 
    v := reflect.ValueOf(s) 
    fmt.Printf("model: %+v %+v %+v\n", s, t, v) 
    fmt.Println(s.Name) 
    s.Method() 
} 

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

प्रश्न

वहाँ शीर्ष स्तर के क्षेत्रों बनाने के लिए एक रास्ता है (नहीं यकीन है कि क्या जाओ में सही शब्द इन के लिए है) सुलभ एम्बेडेड तरीकों से (उदाहरण: s.Name या s.Method()?

धन्यवाद आपका नया गोफर को अपना समय दान करना।

+0

इस अन्य धागे पर इसी तरह के प्रश्न के समाधान देखें: https://stackoverflow.com/questions/22153269/how-to-reflect-fields-of-containing-struct-from-a-method-of-the-embedded -स्ट्रक्चर? आरक्यू = 1 –

उत्तर

1

गो आपके द्वारा किए गए कार्यों के लिए कोई समर्थन प्रदान नहीं करता है: आपके Test विधि का प्राप्तकर्ता Bar सूचक है, और यह बताने का कोई तरीका नहीं है कि यह एम्बेड किया गया है या नहीं।

यदि आप वास्तव में इस मार्ग पर जाना चाहते हैं, तो एक विकल्प interface{} सदस्य को Bar पर जोड़ना होगा और उस प्रकार की आवश्यकता होती है जिसे इसे युक्त प्रकार पर सेट किया जाए। इस सदस्य को शुरू करना या तो किसी भी व्यक्ति ने मूल्य बनाया है, या शायद कॉलर्स को कुछ ओआरएम विधि को निर्धारित करने के लिए मूल्य को पारित करने की आवश्यकता हो सकती है। यह विशेष रूप से सुंदर नहीं है, लेकिन शायद यह संभव है कि आप कर सकें।

वैसे भी, क्या वास्तव में के बजाय एपीआई को db.Save(user) के रूप में संरचना करना बुरा है? पूर्व कई डेटाबेस तक विस्तार करने का एक स्पष्ट तरीका प्रदान करता है, जबकि बाद में वैश्विक स्थिति पर भरोसा करने की अधिक संभावना होती है।

+1

यह वही मार्ग है जो मैंने लिया था। जब तक आपने अपना पहला पोस्ट नहीं किया है, तो मैं अपने प्रश्न का उत्तर नहीं दूंगा, लेकिन मैं आपके उत्तर को आपके उत्तर देने के लिए अपना समाधान प्रदान करूंगा: http://play.golang.org/p/v7lC0swB3s। जहां तक ​​मैं 'डीबी से बचना चाहता हूं।सहेजें (और उपयोगकर्ता) ', इसे एप्लिकेशन द्वारा प्रबंधित किए जाने के लिए अधिक विशिष्टताओं की आवश्यकता होती है। ओआरएम के लिए मेरा विचार आपको एक सक्रिय डीबी ड्राइवर सेट करने की अनुमति देता है और फिर इसके बारे में भूल जाता है ताकि आप अपने मॉडल सीआरयूडी पर सबसे अधिक संभव तरीके से ध्यान केंद्रित कर सकें। आपके समय के लिए धन्यवाद! – Brenden

+0

@ ब्रेंडन क्या आपने कभी इस प्रतिबिंब दृष्टिकोण को लागू किया है? क्या आपको लगता है कि यह काफी अच्छा प्रदर्शन करता है और आप ओवरहेड और "जादू" से खुश थे? – Xeoncross

0

(यदि मैं आपका प्रश्न सही ढंग से समझ गया,) नहीं, एम्बेडिंग विरासत नहीं है। ऐसा लगता है कि आप वास्तव में एक इंटरफ़ेस

type Saver interface { 
    Save() error 
} 

पर प्रासंगिक पार्टियां इसे कार्यान्वित कर सकती हैं।

आपके पास एक सामान्य संरचना base हो सकती है या जो कुछ भी सामान्य तरीकों को लागू करता है और फिर प्रत्येक उच्च स्तरीय संरचना base को कार्यान्वित करने की अनुमति देने के लिए एम्बेड कर सकती है।

+1

मैं इंटरफ़ेस लागू करने वाली प्रत्येक संरचना के लिए कस्टम कार्यान्वयन से बचना चाहता हूं। – Brenden

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