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. Golang中的Stubb接口指針參數
- 2. 作爲JNA方法參數指向結構數組的指針
- 3. 如何使用指向方法的指針作爲參數(何時需要指向函數的指針)?
- 4. 指向指針的指針和指向數組的指針
- 5. 使用指向類方法的指針作爲函數的參數,但作爲函數指針,而不是指向方法的指針
- 6. 指針指向參數中的指針C
- 7. C++指向函數參數指針的指針
- 8. 指向C++類方法的指針
- 9. 不能上傳指向指針參數的指針
- 10. 指針指向數組的指針
- 11. C++ - 指向數組的指針 - 指針
- 12. 指向指針數組的指針是?
- 13. COM - 如何創建一個返回指向接口的指針的方法?
- 14. 指向C中的指針的指針
- 15. 指向指針的指針和指向數組的指針之間的區別?
- 16. 將指向派生類的方法的指針投射到指向基類的方法的指針
- 17. Malloc指向指向結構數組的指針參考
- 18. 指向鏈接列表中的指針的指針
- 19. 泛型接口如何引用指向其類型參數的指針?
- 20. 作爲參數的方法指針
- 21. C#指針在方法的參數?
- 22. 指向鏈接列表指針數組的指針
- 23. 指針指向一個函數,需要指針參數
- 24. 指針指向列表中的指針
- 25. VB2010接受指向子參數的指針
- 26. 通過外部鏈接指向Nontype模板參數的指針
- 27. 設置指向指針的數組,指向另一個數組中的指針
- 28. 指向函數的指針
- 29. 指向數組的指針
- 30. 如何在C++中查找指向接口的指針地址?