एक इंटरफ़ेस प्रकार बस विधियों का एक सेट है। ध्यान दें कि एक इंटरफ़ेस परिभाषा के सदस्य निर्दिष्ट नहीं करते हैं कि रिसीवर प्रकार एक सूचक है या नहीं। ऐसा इसलिए है क्योंकि किसी मान प्रकार का विधि सेट इसके संबंधित सूचक प्रकार के विधि सेट का सबसेट है। यह एक मुट्ठी भर है।क्या मेरा मतलब है, है अगर आपके पास निम्न:
type Whatever struct {
Name string
}
और आपको निम्न दो विधियों को परिभाषित:,
func (w *Whatever) Foo() {
...
}
func (w Whatever) Bar() {
...
}
फिर प्रकार Whatever
एकमात्र तरीका Bar()
है, जबकि प्रकार *Whatever
तरीकों है Foo()
और Bar()
। इसका मतलब है कि यदि आप निम्नलिखित इंटरफेस है:
type Grits interface {
Foo()
Bar()
}
फिर *Whatever
Grits
लागू करता है लेकिन Whatever
नहीं हुआ, क्योंकि Whatever
विधि Foo()
का अभाव है। जब आप किसी फ़ंक्शन में इंटरफ़ेस प्रकार के रूप में इनपुट को परिभाषित करते हैं, तो आपको पता नहीं है कि यह एक सूचक या मान प्रकार है या नहीं। ,,
package main
import "fmt"
type Fruit struct {
Name string
}
func (f Fruit) Rename(name string) {
f.Name = name
}
type Candy struct {
Name string
}
func (c *Candy) Rename(name string) {
c.Name = name
}
type Renamable interface {
Rename(string)
}
func Rename(v Renamable, name string) {
v.Rename(name)
// at this point, we don't know if v is a pointer type or not.
}
func main() {
c := Candy{Name: "Snickers"}
f := Fruit{Name: "Apple"}
fmt.Println(f)
fmt.Println(c)
Rename(f, "Zemo Fruit")
Rename(&c, "Zemo Bar")
fmt.Println(f)
fmt.Println(c)
}
आप Raname(&f, "Jorelli Fruit")
नहीं बल्कि Rename(c, "Jorelli Bar")
कह सकते हैं क्योंकि दोनों Fruit
और *Fruit
Renamable
लागू *Candy
Renable
लागू करता है और Candy
को नहीं हुई:
निम्न उदाहरण एक समारोह है कि दोनों तरीकों से एक अंतरफलक प्रकार लेता है दिखाता है ।
http://play.golang.org/p/Fb-L8Bvuwj