gpt4 book ai didi

pointers - 当存储在指针内时, slice 的`reflect.Kind()`成为`Struct`

转载 作者:行者123 更新时间:2023-12-01 22:39:39 24 4
gpt4 key购买 nike

在检查 slice 的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

但是,当 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

我的问题是:
  • 为什么会发生这种情况?
  • 是否可以将 slice 存储在指针中,并且reflect.Kind()仍将其标识为slice
  • 最佳答案

    1 (reflect.Value).Elem() 返回一个 reflect.Value ,它是一个结构体,如果要查找值所持有的类型,则无需再次将其传递给 reflect.ValueOf

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

    关于pointers - 当存储在指针内时, slice 的`reflect.Kind()`成为`Struct`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59189542/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com