गो

2011-08-12 12 views
12

में इंटरफ़ेस का उपयोग मैं सरल गो (भाषा) में इसका उपयोग करने के उदाहरण के साथ इंटरफ़ेस प्रकार को समझना चाहता हूं।गो

मैंने वेब प्रलेखन पढ़ा, लेकिन मुझे यह नहीं मिला।

+0

आप डॉक्स में इस पढ़ी के बीच बातचीत दिखा ?? http://golang.org/doc/effective_go.html#interfaces_and_types। यह भी एक कोशिश करें http://diveintogo.blogspot.com/2010/03/classic-inheritance-in-go-lang.html – Justin

+1

हाँ, मैंने दस्तावेज़ पढ़े ... लिंक के लिए धन्यवाद – Speccy

उत्तर

34

इंटरफ़ेस जाने के पीछे विचार duck typing है। जो बस इसमें अनुवाद करता है: यदि आप एक बतख की तरह दिखते हैं और बतख की तरह रैक करते हैं तो आप एक बतख हैं। मतलब यह है कि यदि आपका ऑब्जेक्ट सभी बतख की सुविधाओं को लागू करता है तो उसे बतख के रूप में उपयोग करने में कोई समस्या नहीं होनी चाहिए।

package main 

import (
    "fmt" 
) 

type Walker interface { 
    Walk() string 
} 

type Human string 
type Dog string 

func (human Human) Walk() string { //A human is a walker 
    return "I'm a man and I walked!" 
} 

func (dog Dog) Walk() string { //A dog is a walker 
    return "I'm a dog and I walked!" 
} 

//Make a walker walk 
func MakeWalk(w Walker) { 
    fmt.Println(w.Walk()) 
} 

func main() { 
    var human Human 
    var dog Dog 
    MakeWalk(human) 
    MakeWalk(dog) 
} 

यहाँ एक Human एक Walker है और एक Dog एक Walker है: यहाँ एक उदाहरण है। क्यूं कर? क्योंकि वे दोनों .. अच्छी तरह से ... Walk। वे दोनों Walk() string फ़ंक्शन को लागू करते हैं। तो यही कारण है कि आप उन पर MakeWalk निष्पादित कर सकते हैं।

यह बहुत उपयोगी है जब आप अलग-अलग प्रकारों से व्यवहार करना चाहते हैं। एक व्यावहारिक उदाहरण फ़ाइल प्रकार ऑब्जेक्ट्स (सॉकेट, फ़ाइल ऑब्जेक्ट्स) होगा - आपको उन सभी पर एक लिखें और एक रीड फ़ंक्शन चाहिए। फिर आप अपने प्रकार से स्वतंत्र एक ही फैशन में लिखें और पढ़ें का उपयोग कर सकते हैं - जो कि अच्छा है।

+7

धन्यवाद! यह वास्तव में मैं जानना चाहता था। जाओ ट्यूटोरियल की तुलना में बहुत स्पष्ट है। – Speccy

+0

गोलांग के संदर्भ में अंतरफलक क्या लाभ देते हैं? यदि मैं 2 ऑब्जेक्ट्स के लिए इंटरफेस का उपयोग कर रहा हूं, और मेरे इंटरफ़ेस में 3 विधियां हैं, तो क्या इसका मतलब है कि मेरी 2 ऑब्जेक्ट्स को इन 3 विधियों को लागू करना चाहिए? – Avdept

+0

@Avdept हां, आपको अपने प्रकार के इंटरफ़ेस के समान हस्ताक्षर लागू करना होगा। सुनिश्चित नहीं है कि लाभ से आपका क्या मतलब है। –

0

एक और काम कर रहे उदाहरण एक अंतरफलक और एक संरचना

package main 

import "fmt" 

type Info interface { 
Noofchar() int 
Increment() 
} 

type Testinfo struct { 
noofchar int  
} 

func (x *Testinfo) Noofchar() int { 
return x.noofchar 
} 
func (x *Testinfo) Increment() { 
x.noofchar++ 
} 

func main(){ 
var t Info = &Testinfo{noofchar:1} 
fmt.Println("No of char ",t.Noofchar()) 
t.Increment() 
fmt.Println("No of char ",t.Noofchar()) 
} 
+1

आप एक necromancer हैं :) – Speccy