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。

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)
}
}
- 2 回答
- 0 關(guān)注
- 91 瀏覽
添加回答
舉報(bào)