1 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
如果您知道快速的確切類型,則可以使用類型斷言,并且只有在失敗時(shí)才恢復(fù)到反射。
例如:
func EngineCheck(v Vehicle) {
var power float64
if eng, ok := v.(*Car); ok {
power = eng.Power
} else {
power = reflect.ValueOf(v).Elem().FieldByName("Power").Interface().(float64)
}
fmt.Println(power)
}
請(qǐng)注意,類型Car和*Car不同,上面的例子只是將“跳過(guò)”反射一部分,如果你傳遞的價(jià)值的確是一個(gè)指針:*Car。
如果有多種可能的“可接受”類型,您可以使用類型 switch。例如,如果您傳遞 aCar或*Car,則可以Power從兩者中獲取值。此外,如果Engine或*Engine將通過(guò),同樣的事情適用。
func EngineCheck(v Vehicle) {
var power float64
switch i := v.(type) {
case *Car:
power = i.Power
case Car:
power = i.Power
case *Engine:
power = i.Power
case Engine:
power = i.Power
default:
power = reflect.ValueOf(v).Elem().FieldByName("Power").Interface().(float64)
}
fmt.Println(power)
}
但慣用的解決方案仍然是添加一個(gè) getter 函數(shù)Vehicle:
type Vehicle interface {
GetPower() float64
}
請(qǐng)注意,您不必GetPower()在任何地方實(shí)施。如果您在以下位置實(shí)施它Engine:
func (e Engine) GetPower() float64 {
return e.Power
}
你嵌入Engine到Car(像你一樣),你的Car類型將自動(dòng)擁有此GetPower()方法(晉升)在其方法集,因此它會(huì)自動(dòng)執(zhí)行Vehicle。然后您的EngineCheck()功能將非常簡(jiǎn)單:
func EngineCheck(v Vehicle) {
fmt.Println(v.GetPower())
}
在Go Playground上嘗試所有這 3 種變體。
- 1 回答
- 0 關(guān)注
- 149 瀏覽
添加回答
舉報(bào)