2017-08-05 44 views

回答

0

讓我解釋一下:

func (predator Cat) eatingVictim(victim *Mouse) { 
    fmt.Println(predator.name + "'s eating victim " + victim.name) 
    predator.hungry = false 
    victim.alive = false 
} 

您希望:

都在這個函數的第一通過草食動物。這是一個不好的解決方案,因爲您不會在此處使用來自草食動物界面的方法 。更好的方法是定義 另一個接口。

type Animal interface { 
    GetName() string 
    SetAlive(bool) 
} 

並執行它的鼠標(如果你願意貓):

func (m *Mouse) GetName() string { 
    return m.name 
} 

func (m *Mouse) SetAlive(alive bool) { 
    m.alive = alive 
} 

然後接口捕食者更改爲:

type Predator interface { 
    eatingVictim(victim Animal) 
} 

,並實現它的貓

func (predator *Cat) eatingVictim(victim Animal) { 
    fmt.Println(predator.name + "'s eating victim " + victim.GetName()) 
    predator.hungry = false 
    victim.SetAlive(false) 
} 

我需要提到的是,如果喲你希望你的原始結構被修改爲 然後你需要傳遞一個結構指針,而不是結構作爲 接收者參數:

這裏Mouse結構將不會被修改。只有它的副本。

func (herbivore Mouse) eatingGrass() { 
    fmt.Println(herbivore.name + "'s eating a grass.. ^___^") 
    herbivore.hungry = false 
} 

這裏是固定的版本:

func (herbivore *Mouse) eatingGrass() { 
    fmt.Println(herbivore.name + "'s eating a grass.. ^___^") 
    herbivore.hungry = false 
} 

如果你想爲這更好的解釋 - 然後訪問 my blog post

的最後一件事 - 最佳實踐 - 如果你使用結構指針在你的 類型的方法之一,然後所有他們應該採取一個指針。

最終的解決方案:

package main 

import "fmt" 

type Predator interface { 
    eatingVictim(victim Animal) 
} 

type Herbivore interface { 
    eatingGrass() 
} 

type Animal interface { 
    GetName() string 
    SetAlive(bool) 
} 

type Cat struct { 
    name string 
    hungry bool 
    alive bool 
} 

type Mouse struct { 
    name string 
    hungry bool 
    alive bool 
} 

func (herbivore *Mouse) eatingGrass() { 
    fmt.Println(herbivore.name + "'s eating a grass.. ^___^") 
    herbivore.hungry = false 
} 

func (m *Mouse) GetName() string { 
    return m.name 
} 

func (m *Mouse) SetAlive(alive bool) { 
    m.alive = alive 
} 

func (predator *Cat) eatingVictim(victim Animal) { 
    fmt.Println(predator.name + "'s eating victim " + victim.GetName()) 
    predator.hungry = false 
    victim.SetAlive(false) 
} 

func main() { 
    cat := Cat{"cat", true, true} 
    mouse := Mouse{"mouse", true, true} 

    fmt.Println(cat) 
    fmt.Println(mouse) 

    mouse.eatingGrass() 
    cat.eatingVictim(&mouse) 

    fmt.Println(cat) 
    fmt.Println(mouse) 
} 
0

首先你需要一個Name()SetAlive()方法添加到界面,使eatingGrass出口:

type Herbivore interface { 
    Name()string 
    SetAlive(bool) 
    EatingGrass() 
} 

然後,你需要實現Name()鼠標:

func (herbivore *Mouse) Name()string { 
    return Mouse.name 
} 

然後做對於SetAlive也是一樣。

現在,您可以使用該接口:

func (predator Cat) eatingVictim(h Herbivore) { 
    fmt.Println(predator.name + "'s eating victim " + h.Name()) 
    predator.hungry = false 
    h.SetAlive(false) 
} 

注意:您應該實現對*Mouse所有功能。因爲當你設置結構的一些值時,你應該實現指針的方法而不是結構。否則,你可能有錯誤。

當實現,也更好地這樣定義varibale:

func (m *Mouse) Name() string { 
    return m.name 
}