gpt4 book ai didi

go - 如何从嵌入结构的方法中反射(reflect)包含结构的字段?

转载 作者:IT王子 更新时间:2023-10-29 01:07:33 27 4
gpt4 key购买 nike

这个程序的输出是ma​​p[],但是我想要ma​​p[Id:true name:true]

我正在尝试整理我的一些 SQL CRUD 代码,并认为嵌入一个处理读取和写入数据库的持久性结构会很好。在下面的示例中,持久性结构将是 Inner,而我的模型将是 Outer。谢谢!

http://play.golang.org/p/fsPqJ-6aLI
package main

import (
"fmt"
"reflect"
)

type Inner struct {
}

type Outer struct {
Inner
Id int
name string
}

func (i *Inner) Fields() map[string]bool {
typ := reflect.TypeOf(*i)
attrs := make(map[string]bool)

if typ.Kind() != reflect.Struct {
fmt.Printf("%v type can't have attributes inspected\n", typ.Kind())
return attrs
}

// loop through the struct's fields and set the map
for i := 0; i < typ.NumField(); i++ {
p := typ.Field(i)
if !p.Anonymous {
v := reflect.ValueOf(p.Type)
v = v.Elem()
attrs[p.Name] = v.CanSet()

}
}

return attrs
}

func main() {
val := Outer{}
fmt.Println(val.Fields()) // prints map[], but I want map[Id:true name:true]
}

最佳答案

你不能。您专门在 Inner 上调用一个方法,它不知道它嵌入的位置。嵌入不是继承,它是简单的自动委托(delegate)。

您可能希望将它们包装在一个通用的持久性接口(interface)中,或者甚至是一个可以处理持久化数据类型的通用函数中。


现在,如果您真的想尝试这个,您可以通过指针地址访问外部结构,但您需要知道您要访问的外部类型,这意味着你无法通过反射获得它。

outer := (*Outer)(unsafe.Pointer(i))
typ := reflect.TypeOf(*outer)

关于go - 如何从嵌入结构的方法中反射(reflect)包含结构的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22153269/

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