第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

通過(guò)接口訪問(wèn)嵌入類型字段

通過(guò)接口訪問(wèn)嵌入類型字段

Go
暮色呼如 2021-12-13 18:26:46
好像我錯(cuò)過(guò)了一些重要的東西,但我無(wú)法弄清楚它是什么。我使用反射通過(guò)接口訪問(wèn)嵌入類型的字段。我的問(wèn)題是,根據(jù)runtime/pprof它吃掉了很多 CPU。我不喜歡在所有車輛上實(shí)現(xiàn) Setter 和 Getter 方法,所以有更好的方法嗎?簡(jiǎn)化示例:package mainimport(    "reflect"    "fmt")// the "contract" is that all vehicles have an embedded Enginetype Vehicle interface {}type Engine struct {    Power float64    Cubic float64}type Car struct {    Engine    Weight float64    TopSpeed float64}// more Vehicles with Engines here...func EngineCheck(v Vehicle) {    // this does not work:    //power := v.Power    // reflection works but eats up a lot of CPU:    power := reflect.ValueOf(v).Elem().FieldByName("Power").Interface().(float64)    fmt.Println(power)}func main() {    c1 := &Car{Engine{120.0, 1.2}, 1.5, 250}    EngineCheck(c1)}
查看完整描述

1 回答

?
叮當(dāng)貓咪

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 種變體。


查看完整回答
反對(duì) 回復(fù) 2021-12-13
  • 1 回答
  • 0 關(guān)注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)