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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中訪問接口的字段?

如何在 Go 中訪問接口的字段?

Go
慕尼黑5688855 2022-01-04 10:49:40
我正在嘗試這樣做:if event.Type == sdl.QUIT {    utils.Running = false}但我不能,因?yàn)楫?dāng)我嘗試構(gòu)建時,我收到此錯誤: ./mm.go:11: event.Type undefined (type sdl.Event has no field or method Type)這是我嘗試使用的庫的相關(guān)源代碼:type Event interface{}    type CEvent struct {    Type uint32    _    [52]byte // padding}type CommonEvent struct {    Type      uint32    Timestamp uint32}// WindowEvent (https://wiki.libsdl.org/SDL_WindowEvent)type WindowEvent struct {    Type      uint32    Timestamp uint32    WindowID  uint32    Event     uint8    _         uint8 // padding    _         uint8 // padding    _         uint8 // padding    Data1     int32    Data2     int32}如您所見,所有其他事件都有字段Type。我怎樣才能訪問這個?解決方案這就是我最終在Go 的 SDL2 綁定中輪詢事件的方式,以防有人想知道:func PollEvents() {    for {        if event := sdl.PollEvent(); event != nil {            switch event.(type) {            case *sdl.QuitEvent:                utils.Running = false            }        } else {            break        }    }}
查看完整描述

3 回答

?
心有法竹

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個贊

你實(shí)際上不能。接口只定義一個類型可用的方法集,它們不公開字段。在您的情況下,我建議您進(jìn)行類型切換。它看起來有點(diǎn)像這樣;


     switch v := myInstance.(type) {

                case CEvent:

                        fmt.Println(v)

                case CommonEvent:

                        fmt.Println(v)

                case WindowEvent:

                        fmt.Println(v)

                default:

                        fmt.Println("unknown")

        }

您可能希望根據(jù)您在此之后對實(shí)例執(zhí)行的操作以稍微不同的方式構(gòu)建您的代碼,但這為您提供了基本思想。您還可以使用單個類型進(jìn)行類型斷言,例如;v, err := myInstance.(CommonEvent)但我懷疑它在這里是否有效。如果類型myInstance不是CommonEvent,它也會返回錯誤,因此這并不是確定可能是什么類型和接口實(shí)例的最佳方法。


查看完整回答
反對 回復(fù) 2022-01-04
?
躍然一笑

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個贊

您將需要知道類型。假設(shè)我們知道這是一個 CEvent:


cEvent, ok := Event.(CEvent)

if !ok {

    // You lied, not a CEvent

    return

}


// Otherwise, you can get the type!

fmt.Println(cEvent.Type)

當(dāng)然,如果你不知道類型,你可以保持類型斷言,直到你正確為止。否則,拋出錯誤,返回默認(rèn)值等:


func getType(i interface{}) uint32 {

    cEvent, ok := i.(CEvent)

    if ok {

        return cEvent.Type

    }


    commonEvent, ok := i.(CommonEvent)

    if ok {

        return commonEvent.Type

    }


    // Etc


    return <default>

}


查看完整回答
反對 回復(fù) 2022-01-04
?
慕萊塢森

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個贊

您可能會花費(fèi)大量時間進(jìn)行反射調(diào)用或嘗試猜測類型或使用類型切換。


或者,您可以定義一個接口,其中包含返回所需信息的函數(shù)。


例如你可以做


type Event interface {

    GetCommonEvent() *CommonEvent

    GetWindowEvent() *WindowEvent

}


查看完整回答
反對 回復(fù) 2022-01-04
  • 3 回答
  • 0 關(guān)注
  • 220 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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