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 關注
- 223 瀏覽
添加回答
舉報