2 回答
TA贡献1828条经验 获得超3个赞
Go 不支持继承,但也许您会发现以下方法是可以容忍的。
使用 来定义 的行为:interface
Animal
type Animal interface {
GetName() string
GetOrigin() string
GetSpeed() float32
}
使用“基”类型,该类型将包含公共字段并实现以下行为:
type AnimalBase struct {
Name string
Origin string
}
func (a AnimalBase) GetName() string { return a.Name }
func (a AnimalBase) GetOrigin() string { return a.Origin }
func (a AnimalBase) GetSpeed() float32 { return -1 }
嵌入“基”类型并覆盖您需要的任何行为:
type Bird struct {
AnimalBase
Speed float32
CanFly bool
}
func (b Bird) GetSpeed() float32 { return b.Speed }
然后。。。
func checkAminalSpeed(a Animal) {
if speed := a.GetSpeed(); speed == -1 {
fmt.Println("I don't have speed")
} else {
fmt.Println(speed)
}
}
https://play.golang.org/p/KIjfC7Rdyls
TA贡献1828条经验 获得超4个赞
姆科普里瓦是对的。Go不支持继承,也可以使用反射和接口{}
ps:反映比接口更多的时间
package main
import (
"fmt"
"reflect"
)
type Animal struct {
Name string
Origin string
}
type Bird struct {
Animal
Speed float32
CanFly bool
}
type Bear struct {
Animal
Lazy bool
}
func checkAminalSpeed (a interface{}){
v := reflect.ValueOf(a)
if f, ok := v.Type().FieldByName("Speed"); ok{
fmt.Printf("%v\n", f)
}
}
func main() {
checkAminalSpeed(Bird{})
checkAminalSpeed(Bear{})
}
- 2 回答
- 0 关注
- 64 浏览
添加回答
举报