0
A
回答
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
}
相關問題
- 1. 作爲JNA方法參數指向結構數組的指針
- 2. 指向指針的指針和指向數組的指針
- 3. 指針指向參數中的指針C
- 4. 指向C++類方法的指針
- 5. 不能上傳指向指針參數的指針
- 6. 指向指針數組的指針是?
- 7. C++ - 指向數組的指針 - 指針
- 8. COM - 如何創建一個返回指向接口的指針的方法?
- 9. Malloc指向指向結構數組的指針參考
- 10. 指向鏈接列表中的指針的指針
- 11. C#指針在方法的參數?
- 12. 指向鏈接列表指針數組的指針
- 13. 通過外部鏈接指向Nontype模板參數的指針
- 14. 指向函數的指針
- 15. 指向數組的指針
- 16. 指向數組的指針數組,其中每個指針指向數組
- 17. 如何在C++中查找指向接口的指針地址?
- 18. 從接口指針獲取接口/對象的正確方法?
- 19. 指針和數組[指針int和指向char的指針]
- 20. 指向指向int參數並返回void的函數的指針數組的指針
- 21. 使用指向常量數據的指針的替代方法?
- 22. COM互操作和編組指針指向一個接口的指針在C#
- 23. 參考和指向接口的指針之間的C++不同行爲
- 24. 指向Struct的指針的指針
- 25. 指針指向指針
- 26. C++ - 指向向量的指針數組?
- 27. 使用指向類私有方法的指針命名參數成語
- 28. 成員函數指針指向另一個對象的方法
- 29. 傳遞指向模板類方法的指針數組
- 30. 指針接收方法