पर ध्यान दिए बिना इंटरफ़ेस पर गतिशील रूप से कॉल विधि {} मैं गो में लिखित एक टेम्पलेटिंग सिस्टम पर काम कर रहा हूं, जिसका अर्थ है कि इसे reflect
पैकेज का उदार उपयोग करने की आवश्यकता है। इस विशिष्ट परिस्थिति में मुझे interface{}
पर गतिशील रूप से एक विधि कॉल करने में सक्षम होना चाहिए। विचित्रता यह है कि मेरा प्रतिबिंब तर्क तब तक ठीक काम करता है जब तक मेरा डेटा ज्ञात प्रकार का न हो, लेकिन यदि डेटा interface{}
प्रकार का है।रिसीवर प्रकार
निम्न उदाहरण आप देख सकते हैं कि main()
और Pass()
में तर्क समान है। फर्क सिर्फ इतना है डेटा एक ज्ञात प्रकार या एक interface{}
जाओ खेलो अंदर एक ज्ञात प्रकार है कि क्या है: http://play.golang.org/p/FTP3wgc0sZ
package main
import (
"fmt"
"reflect"
)
type Test struct {
Start string
}
func (t *Test) Finish() string {
return t.Start + "finish"
}
func Pass(i interface{}) {
_, ok := reflect.TypeOf(&i).MethodByName("Finish")
if ok {
fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0])
} else {
fmt.Println("Pass() fail")
}
}
func main() {
i := Test{Start: "start"}
Pass(i)
_, ok := reflect.TypeOf(&i).MethodByName("Finish")
if ok {
fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0])
} else {
fmt.Println("main() fail")
}
}
इस कोड को हम निम्न परिणाम
Pass() fail
startfinish
पाने को क्रियान्वित करने पर कौन सा इसका मतलब है कि एक विधि को गतिशील रूप से कॉल करने के लिए मेरी पद्धति एक परिदृश्य को छोड़कर ठीक काम करती है जब मेरी ऑब्जेक्ट वर्तमान में interface{}
में होती है।
यदि इसके बजाय मैं एक सूचक रिसीवर का उपयोग नहीं करता और i
पास करता हूं तो यह अपेक्षा के अनुसार काम करता है।
जाओ खेल: http://play.golang.org/p/myM0UXVYzX
यह मैं विश्वास करने के लिए मेरी समस्या है जब यह एक interface{}
है कि मैं मैं का पता (&i
) उपयोग नहीं कर सकते है। मैंने प्रतिबिंबित पैकेज और परीक्षण की गई चीजें जैसे reflect.Value.Addr()
और reflect.PtrTo()
को खराब कर दिया है, लेकिन मैं जिस तरह से आवश्यक था, मैं काम नहीं कर सका। मेरा झुकाव यह है कि इस तथ्य के साथ कुछ करना है कि interface{}
परिभाषा एक संदर्भ वस्तु है।
धन्यवाद। यद्यपि मेरा प्रश्न अलग था, लेकिन आपके उत्तर ने मुझे यह निर्धारित करने में मदद की कि क्या एक संरचना के पास 'IsValid() 'है। – Matt
मैं अपने स्वयं के प्रश्न का उत्तर देने की कोशिश करते समय इस (http://play.golang.org/p/v7lC0swB3s) के साथ आया (http://stackoverflow.com/questions/20167935/can-embedded-methods-access- माता-पिता -खेत) – Brenden