当存储在指针内部时,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

我的问题是:

  1. 为什么会这样?

  2. 有没有一种方法可以将切片存储在指针中,并且仍然 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 如果您要查找该值所包含的类型,请再次输入。

2rPointer.Elem().Kind() 应该足以满足您的需求。