gpt4 book ai didi

go - 如何检查接口(interface)是否是指向 slice 的指针

转载 作者:行者123 更新时间:2023-12-02 16:04:58 25 4
gpt4 key购买 nike

我知道如何检查一个接口(interface)是否是一个指针:

func isPointerArray(i interface{}) bool {
if i == nil {
return false
}
if reflect.ValueOf(i).Kind() != reflect.Ptr {
return false
}
}

但是我如何检查该指针是否是一个 slice ? TypeOf 是一个指针。

最佳答案

如果值的种类是reflect.Ptr,你可以使用Value.Elem()得到指向的值,你可以将它的类型与 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
}

但是有一个问题。如果传递的值是一个指向 slice 类型的指针,但值本身是 nil 指针,这将报告 false。可以理解,因为没有类型可以是 slice 的指向值。这可能是也可能不是您想要的。

如果您希望 true 即使是 nil 指针值(指向 slice 类型的指针),您也可以使用 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

正如您在最后一行中看到的(其中值为*[]string 类型的nil 指针)isPtrSlice()返回 falseisPtrSlice2() 返回 true

关于go - 如何检查接口(interface)是否是指向 slice 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69675420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com