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

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

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

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

Go
富國(guó)滬深 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是一個(gè)指針。
查看完整描述

2 回答

?
守候你守候我

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

如果 value 的 kind 是reflect.Ptr,你可以Value.Elem()用來(lái)獲取指向的值,你可以將它的 kind 與 進(jìn)行比較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

}

但是有一個(gè)問(wèn)題。如果傳遞的值是指向切片類型的指針,但值本身是nil指針,則會(huì)報(bào)告false. 可以理解,因?yàn)闆](méi)有類型可以是切片的指向值。這可能是也可能不是您想要的。


如果您true甚至想要nil指針值(指向切片類型的指針),您可以使用reflect.Type而不是reflect.Value. 這也適用于nil指針,因?yàn)榧词箾](méi)有指向的值,仍然有一個(gè)指向的類型(稱為基本類型)。


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

}

測(cè)試上述功能:


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))

}

哪個(gè)會(huì)輸出(在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時(shí)isPtrSlice2()返回true。


查看完整回答
反對(duì) 回復(fù) 2022-10-10
?
慕虎7371278

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

您可以使用類型斷言:


package main


import "fmt"


func main() {

    var value interface{}

    value = &[]int{1, 2}


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

        fmt.Println(res)

    }

}


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

添加回答

舉報(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)