2013-07-27 108 views
4

例如,在下面的例子:在Go中,類型和指向一個類型的指針都可以實現一個接口嗎?

type Food interface { 
    Eat() bool 
} 

type vegetable_s struct { 
    //some data 
} 

type Vegetable *vegetable_s 

type Salt struct { 
    // some data 
} 

func (p Vegetable) Eat() bool { 
    // some code 
} 

func (p Salt) Eat() bool { 
    // some code 
} 

VegetableSalt既滿足Food,即使一個是一個指針,另一個是直接一個結構?

回答

12

答案很容易通過compiling the code得到:

prog.go:19: invalid receiver type Vegetable (Vegetable is a pointer type) 

該錯誤是基於對specs要求:

接收器類型必須是形式爲T或* T,其中T是一個類型名稱。由T表示的類型稱爲接收器基類型; 它不能是指針或接口類型並且它必須在與方法相同的包中聲明。

(強調礦)

聲明:

type Vegetable *vegetable_s 

聲明一個指針類型,即。 Vegetable不適合作爲方法接收方。

+2

人知道爲什麼會設計這樣的嗎? –

0

你可以做到以下幾點:

package main 

type Food interface { 
    Eat() bool 
} 

type vegetable_s struct {} 
type Vegetable vegetable_s 
type Salt struct {} 

func (p *Vegetable) Eat() bool {return false} 
func (p Salt) Eat() bool {return false} 

func foo(food Food) { 
    food.Eat() 
} 

func main() { 
    var f Food 
    f = &Vegetable{} 
    f.Eat() 
    foo(&Vegetable{}) 
    foo(Salt{}) 
} 
+0

我想要它做的是,對於函數func foo(x Food){...},把它叫做'foo(vegetable_pointer)'而不是'foo(salt_value)'。 – Matt

+0

@Matt我在上面的答案中加了foo函數。如果對象作爲參數傳遞給期望接口的方法,則這些對象將自動「包裝」到目標接口中。 – metakeule

相關問題