gpt4 book ai didi

reflection - 指针、数组和 slice 的结构值

转载 作者:IT王子 更新时间:2023-10-29 02:28:03 25 4
gpt4 key购买 nike

我想要一个通用的方法,无论它是作为指针、 slice 还是数组提供,它总是返回结构值。

我对此的看法:

func main() {
p := Person{}

if value(p).Kind() != reflect.Struct {
fmt.Printf("Error 1")
}
if value(&p).Kind() != reflect.Struct {
fmt.Printf("Error 2")
}
if value([]Person{p}).Kind() != reflect.Struct {
fmt.Printf("Error 3")
}
if value(&[]Person{p}).Kind() != reflect.Struct {
fmt.Printf("Error 4")
}
}

func value(m interface{}) reflect.Value {
v := reflect.ValueOf(m)

switch v.Kind() {
case reflect.Ptr:
v = v.Elem()

fallthrough
case reflect.Slice, reflect.Array:
v = v.Elem()
}

return v
}

Go Playground

如您所见,问题在于从 slicearray 中获取结构体。

我需要如何扩展上述函数以从数组或 slice 中获取结构值?

更新:我想做的是将 []People 变成 People

最佳答案

如果即使 slice 为 nil 也只需要类型,则可以使用类似 this 的东西:

func value(m interface{}) reflect.Type {
t := reflect.Indirect(reflect.ValueOf(m)).Type()
if t.Kind() == reflect.Slice || t.Kind() == reflect.Array {
t = t.Elem()
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
return t

}
return t
}

关于 Type.Elem(),来自 http://golang.org/pkg/reflect/#Type :

// Elem returns a type's element type.

// It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice.

//edit 更新函数以处理指针 slice 。

关于reflection - 指针、数组和 slice 的结构值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25102827/

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