当存储在指针内时,切片的`reflect.Kind()`成为`Struct`

时间:2019-12-05 06:36:36

标签: pointers go slice reflect

检查切片的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 个答案:

答案 0 :(得分:2)

1 (reflect.Value).Elem()返回一个reflect.Value,它是一个 结构,不需要再次传递给reflect.ValueOf重新寻找该值所持有的类型。

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