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

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

如何檢查切片界面元素是否具有相同的動態(tài)類型?

如何檢查切片界面元素是否具有相同的動態(tài)類型?

Go
翻過高山走不出你 2022-11-15 13:39:01
我有以下結(jié)構(gòu),它們遵循這個結(jié)構(gòu):A是接口,B, C,D都是帶接口的類型A。我有一部分變量args都帶有 interface 類型A,每個變量都可以是B, C,D特定類型。我想寫一個for循環(huán)來判斷切片中的所有變量是否都屬于同一個動態(tài)類型。我寫了以下代碼:var existingTyp Afor i, d := range args { switch typ := d.(type) {   case *B, *C, *D:    if existingTyp == nil {        existingTyp = typ    } else {        if typ != existingTyp {            panic("error!")        }   }}如何修改代碼來實現(xiàn)我想要的?
查看完整描述

2 回答

?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗 獲得超10個贊

您不能==在接口值上使用相等運(yùn)算符。即使動態(tài)類型相同,如果它們具有不同值的字段,比較也可能返回 false。或者它會恐慌 if B,C并且D與開始時不可比較。


相反,您可以使用反射并使用==on reflect.Type。如果您添加更多實現(xiàn)A.


func dynamicTypesEq(args []A) bool {

    var a reflect.Type

    for _, d := range args {

        t := reflect.TypeOf(d)

        if a == nil {

            a = t

            continue

        }

        if a != t {

            return false

        }


    }

    return true

}

使用一些示例切片調(diào)用函數(shù):


func main() {

    a := []A{&B{}, &B{}, &B{}}

    fmt.Println(dynamicTypesEq(a)) // true


    b := []A{&C{}, &B{}, &B{}}

    fmt.Println(dynamicTypesEq(b)) // false



    c := []A{&D{}, &D{}, &B{}}

    fmt.Println(dynamicTypesEq(c)) // false

}

請注意,如果輸入具有*B和,則此函數(shù)報告錯誤B。顯然,指針類型與基類型不同。


游樂場:https ://go.dev/play/p/QOCvSyxGPRU


查看完整回答
反對 回復(fù) 2022-11-15
?
翻閱古今

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

這是使用 reflect 包的方法。如果某個元素的類型與第一個元素的類型不同,則切片包含混合值類型。


func check(args []interface{}) bool {

    if len(args) == 0 {

        return true

    }

    t := reflect.TypeOf(args[0])

    for _, v := range args[1:] {

        if reflect.TypeOf(v) != t {

            return false

        }

    }

    return true

}

以下是如何在沒有反射的情況下做到這一點。保留一個狀態(tài)變量,記錄最后看到的類型。如果當(dāng)前類型不是最后一個類型,則切片包含混合值類型。


func check(args []interface{}) bool {

    const (

        initState = iota

        typeB

        typeC

        typeD

    )

    state := initState

    for _, d := range args {

        switch d.(type) {

        case *B:

            if state != initState && state != typeB {

                return false

            }

            state = typeB

        case *C:

            if state != initState && state != typeC {

                return false

            }

            state = typeC

        case *D:

            if state != initState && state != typeD {

                return false

            }

            state = typeD

        default:

            panic("unsupported type")

        }

    }

    return true

}


查看完整回答
反對 回復(fù) 2022-11-15
  • 2 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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