当存储在指针内部时,Slice 的 `reflect.Kind()` 变为 `Struct`
`reflect.Kind()` of Slice Becomes `Struct` When Stored Inside Pointer
检查切片的 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
?
1。 (reflect.Value).Elem()
returns a reflect.Value
, which is a struct, and which does not need to be passed to reflect.ValueOf
如果您要查找该值所包含的类型,请再次输入。
2。 rPointer.Elem().Kind()
应该足以满足您的需求。
检查切片的 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
?
1。 (reflect.Value).Elem()
returns a reflect.Value
, which is a struct, and which does not need to be passed to reflect.ValueOf
如果您要查找该值所包含的类型,请再次输入。
2。 rPointer.Elem().Kind()
应该足以满足您的需求。