检查切片的reflect.Kind()
时,如果reflect
未存储在指针中,则会正确地将其标识为slice
:
package main
import (
"fmt"
"reflect"
)
type Dog struct {
Name string
Age int
}
func main() {
var dogs []Dog
rDogs := reflect.ValueOf(dogs)
fmt.Println(rDogs.Kind())
}
输出:
slice
但是,当切片存储在指针中时,reflect.Kind()
将其标识为struct
:
package main
import (
"fmt"
"reflect"
)
type Dog struct {
Name string
Age int
}
func main() {
dogs1 := make([]Dog, 0)
pointer := &dogs1
printPointerValueKind(pointer)
var dogs2 []Dog
pointer = &dogs2
printPointerValueKind(pointer)
}
func printPointerValueKind(pointer interface{}) {
if pointer != nil {
rPointer := reflect.ValueOf(pointer)
if rPointer.Kind() == reflect.Ptr {
value := rPointer.Elem()
rValue := reflect.ValueOf(value)
fmt.Println(rValue.Kind())
}
}
}
输出:
struct
struct
我的问题是:
为什么会这样?
是否有一种方法可以将切片存储在指针中,并且仍然reflect.Kind()
将其标识为slice
?
答案 0 :(得分:2)
1 。 (reflect.Value).Elem()
返回一个reflect.Value
,它是一个 结构,不需要再次传递给reflect.ValueOf
重新寻找该值所持有的类型。
2 。 rPointer.Elem().Kind()
应该足以满足您的需求。