我知道如何檢查介面是否是指標:
func isPointerArray(i interface{}) bool {
if i == nil {
return false
}
if reflect.ValueOf(i).Kind() != reflect.Ptr {
return false
}
}
但是如何檢查該指標是否為切片?TypeOf是一個指標。
uj5u.com熱心網友回復:
如果值的種類是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
}
但是有一個問題。如果傳遞的值是指向切片型別的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
正如您在最后一行中看到的(這里的值是一個nil型別的指標*[]string)isPtrSlice()回傳falsewhileisPtrSlice2()回傳true。
uj5u.com熱心網友回復:
您可以使用型別斷言:
package main
import "fmt"
func main() {
var value interface{}
value = &[]int{1, 2}
if res, ok := value.(*[]int); ok {
fmt.Println(res)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334849.html
