インターフェイスタイプは、単に一連のメソッドです。インターフェース定義のメンバーは、レシーバー・タイプがポインターであるかどうかを指定しないことに注意してください。これは、の値型のメソッドセットが、対応するポインタタイプのメソッドセットのサブセットであるためです。それは一口です。
type Whatever struct {
Name string
}
、あなたは次の二つの方法を定義します:
func (w *Whatever) Foo() {
...
}
func (w Whatever) Bar() {
...
}
をタイプ*Whatever
はメソッドを持っていながらタイプWhatever
は、唯一の方法Bar()
を持っている私は何を意味することは、以下を持っている場合、ありますFoo()
およびBar()
。
type Grits interface {
Foo()
Bar()
}
Whatever
メソッドFoo()
がないため、その後*Whatever
は、Grits
を実装していますがWhatever
ません:それはあなたが次のインタフェースを持っている場合を意味します。関数への入力をインタフェース型として定義するときは、それがポインタか値型かどうかはわかりません。
次の例では、両方の方法でインターフェイスタイプをとる関数を示しています
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)
}
*Candy
がRenable
を実装しCandy
はそうではないFruit
と*Fruit
の両方が、Renamable
を実装するので、あなたは、Raname(&f, "Jorelli Fruit")
なくRename(c, "Jorelli Bar")
を呼び出すことができます。関数呼び出しで
http://play.golang.org/p/Fb-L8Bvuwj