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

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

如何檢查接口是否是指向切片的指針

如何檢查接口是否是指向切片的指針

Go
富國滬深 2022-10-10 15:41:22
我知道如何檢查接口是否是指針:func isPointerArray(i interface{}) bool {    if i == nil {        return false    }    if reflect.ValueOf(i).Kind() != reflect.Ptr {        return false    }}但是如何檢查該指針是否為切片?TypeOf是一個指針。
查看完整描述

2 回答

?
守候你守候我

TA貢獻1802條經(jīng)驗 獲得超10個贊

如果 value 的 kind 是reflect.Ptr,你可以Value.Elem()用來獲取指向的值,你可以將它的 kind 與 進行比較reflect.Slice。


這就是它的樣子:


func isPtrSlice(i interface{}) bool {

    if i == nil {

        return false

    }

    v := reflect.ValueOf(i)

    if v.Kind() != reflect.Ptr {

        return false

    }

    return v.Elem().Kind() == reflect.Slice

}

但是有一個問題。如果傳遞的值是指向切片類型的指針,但值本身是nil指針,則會報告false. 可以理解,因為沒有類型可以是切片的指向值。這可能是也可能不是您想要的。


如果您true甚至想要nil指針值(指向切片類型的指針),您可以使用reflect.Type而不是reflect.Value. 這也適用于nil指針,因為即使沒有指向的值,仍然有一個指向的類型(稱為基本類型)。


func isPtrSlice2(i interface{}) bool {

    if i == nil {

        return false

    }

    t := reflect.TypeOf(i)

    if t.Kind() != reflect.Ptr {

        return false

    }

    return t.Elem().Kind() == reflect.Slice

}

測試上述功能:


vals := []interface{}{

    nil,

    "a",

    &image.Point{},

    []string{},

    &[]string{},

    (*[]string)(nil),

}


for _, v := range vals {

    fmt.Printf("%-14T isPtrSlice: %-5t, isPtrSlice2: %t\n",

        v, isPtrSlice(v), isPtrSlice2(v))

}

哪個會輸出(在Go Playground上試試):


<nil>          isPtrSlice: false, isPtrSlice2: false

string         isPtrSlice: false, isPtrSlice2: false

*image.Point   isPtrSlice: false, isPtrSlice2: false

[]string       isPtrSlice: false, isPtrSlice2: false

*[]string      isPtrSlice: true , isPtrSlice2: true

*[]string      isPtrSlice: false, isPtrSlice2: true

正如您在最后一行(其中值是niltype 的指針*[]string)中看到的那樣,在isPtrSlice()返回false時isPtrSlice2()返回true。


查看完整回答
反對 回復 2022-10-10
?
慕虎7371278

TA貢獻1802條經(jīng)驗 獲得超4個贊

您可以使用類型斷言:


package main


import "fmt"


func main() {

    var value interface{}

    value = &[]int{1, 2}


    if res, ok := value.(*[]int); ok {

        fmt.Println(res)

    }

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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