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

问题描述 投票:0回答:1

[检查切片的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

pointers go slice reflect
1个回答
1
投票

1

© www.soinside.com 2019 - 2024. All rights reserved.