3 回答
TA贡献1796条经验 获得超4个赞
也许您可以添加一个接口以确保获得对父结构的引用:
type AnimalGetter interface {
GetAnimal() *Animal
}
func (dog *Dog) GetAnimal() *Animal {
return &dog.Animal
}
这将允许您的 save 方法进行类型断言(AnimalGetter):
func save(obj interface{}) {
animal := obj.(AnimalGetter)
fmt.Printf("%v\n", animal.GetAnimal())
}
输出:
&{{dogid} wouf 0}
&{dogid}
更简单:
func save(animal AnimalGetter) {
fmt.Printf("%v\n", animal.GetAnimal())
}
TA贡献1744条经验 获得超4个赞
你可以用这个小反射技巧来做到这一点,尽管使用@VonC 建议的接口可能是一种更实用和惯用的方法。
无论如何,这是通过反射实现的:
func main() {
d := Dog {
Animal { "id1111" },
"Barky",
4,
}
fmt.Println(reflect.ValueOf(d).FieldByName("Animal").Interface().(Animal))
}
TA贡献1860条经验 获得超8个赞
这里的 go/Go 方法是声明Animal为接口:
type Animal interface {
ID() int
Name() string
// Other Animal field getters here.
}
然后,save可以将其Animal作为参数并使用Animal的方法获取所需的所有信息。
另一种可能的方法是使用reflect包Animal从结构中获取字段,但这会比使用接口更复杂、更脏并且可能更慢。
- 3 回答
- 0 关注
- 186 浏览
添加回答
举报