为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查接口是否是指向切片的指针

如何检查接口是否是指向切片的指针

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条经验 获得超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条经验 获得超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 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信