मैं इस तथ्य से परिचित हूं कि, गो में, इंटरफ़ेस डेटा की बजाय कार्यक्षमता को परिभाषित करता है। आपने इंटरफ़ेस में विधियों का एक सेट रखा है, लेकिन आप किसी भी फ़ील्ड को निर्दिष्ट करने में असमर्थ हैं जो उस इंटरफ़ेस को लागू करने वाली किसी भी चीज़ पर आवश्यक होगा।गो इंटरफ़ेस फ़ील्ड
उदाहरण के लिए:
// Interface
type Giver interface {
Give() int64
}
// One implementation
type FiveGiver struct {}
func (fg *FiveGiver) Give() int64 {
return 5
}
// Another implementation
type VarGiver struct {
number int64
}
func (vg *VarGiver) Give() int64 {
return vg.number
}
अब हम इंटरफेस और इसके कार्यान्वयन का उपयोग कर सकते हैं:
type Person interface {
Name string
Age int64
}
type Bob struct implements Person { // Not Go syntax!
...
}
func PrintName(aPerson Person) {
fmt.Println("Person's name is: ", aPerson.Name)
}
func main() {
b := &Bob{"Bob", 23}
PrintName(b)
}
:
// A function that uses the interface
func GetSomething(aGiver Giver) {
fmt.Println("The Giver gives: ", aGiver.Give())
}
// Bring it all together
func main() {
fg := &FiveGiver{}
vg := &VarGiver{3}
GetSomething(fg)
GetSomething(vg)
}
/*
Resulting output:
5
3
*/
अब, आप ऐसा नहीं सकते हैं कि क्या कुछ इस तरह है
हालांकि, इंटरफेस और एम्बेडेड के साथ खेलने के बाद structs, मैं यह करने के लिए एक रास्ता खोज की है, एक फैशन के बाद:
type PersonProvider interface {
GetPerson() *Person
}
type Person struct {
Name string
Age int64
}
func (p *Person) GetPerson() *Person {
return p
}
type Bob struct {
FavoriteNumber int64
Person
}
एम्बेडेड struct की वजह से, बॉब सब कुछ व्यक्ति है है। यह PersonProvider इंटरफ़ेस को भी लागू करता है, इसलिए हम उस इंटरफ़ेस का उपयोग करने के लिए डिज़ाइन किए गए कार्यों में बॉब को पास कर सकते हैं।
func DoBirthday(pp PersonProvider) {
pers := pp.GetPerson()
pers.Age += 1
}
func SayHi(pp PersonProvider) {
fmt.Printf("Hello, %v!\r", pp.GetPerson().Name)
}
func main() {
b := &Bob{
5,
Person{"Bob", 23},
}
DoBirthday(b)
SayHi(b)
fmt.Printf("You're %v years old now!", b.Age)
}
Here is a Go Playground जो उपरोक्त कोड प्रदर्शित करता है।
इस विधि का उपयोग करके, मैं एक इंटरफ़ेस बना सकता हूं जो व्यवहार के बजाय डेटा को परिभाषित करता है, और जिसे उस डेटा को एम्बेड करके किसी भी संरचना द्वारा कार्यान्वित किया जा सकता है। आप उन कार्यों को परिभाषित कर सकते हैं जो उस एम्बेडेड डेटा के साथ स्पष्ट रूप से बातचीत करते हैं और बाहरी संरचना की प्रकृति से अनजान हैं। और संकलन समय पर सबकुछ जांच लिया जाता है! (एक ही तरीका है कि आप गंदगी, कि मैं देख सकता हूँ, Bob
में इंटरफ़ेस PersonProvider
embedding, बल्कि एक ठोस Person
से हो सकता है यह संकलन और रनटाइम पर विफल हो जाएगा।।)
अब, यहाँ मेरे सवाल है: यह है एक साफ चाल है, या मैं इसे अलग तरीके से कर रहा हूँ?
"मैं एक इंटरफ़ेस बना सकता हूं जो व्यवहार के बजाय डेटा को परिभाषित करता है"। मैं तर्क दूंगा कि आपके पास ऐसा व्यवहार है जो डेटा देता है। – jmaloney
मैं एक उत्तर लिखने वाला हूँ; मुझे लगता है कि अगर आपको इसकी ज़रूरत है और परिणामों को पता है तो यह ठीक है, लेकिन परिणाम हैं और मैं इसे हर समय नहीं करूँगा। – twotwotwo
@jmaloney मुझे लगता है कि आप सही हैं, अगर आप इसे स्पष्ट रूप से देखना चाहते हैं। लेकिन समग्र रूप से, मैंने दिखाए गए विभिन्न टुकड़ों के साथ, अर्थशास्त्र बन गए "यह फ़ंक्शन किसी भी संरचना को स्वीकार करता है जिसमें इसकी रचना में ___ है"। कम से कम, यही मेरा इरादा है। –