pla*_*twp 5 reflection inheritance go hypermedia
我正在尝试编写一个可以在 Golang 中接收不同自定义类型的辅助函数,但我不知道如何完全按照我想要的方式进行。情况是这样的(顺便说一下,我正在构建一个返回 JSON 对象的 API,它实现了 HAL 协议。这只是意味着资源和关系作为链接返回,而不是简单的 ID')。
我的应用程序中有许多模型,例如学生、校长、学校等……这些模型中的每一个都有许多领域,有些相同,有些不同。理想情况下,我想要一个可以遍历结构的字段并更改结构中的另一个字段的函数。最大的挑战是这些结构可以是学生、校长、学校等类型......
楷模:
type Person struct {
halgo.Links
Id bson.ObjectId
Firstname string
Lastname string
Email string
}
type Student struct {
Person `bson:",inline"`
School mgo.DBRef
}
type School struct {
Id bson.ObjectId
Address []string
Name string
Description string
}
Run Code Online (Sandbox Code Playgroud)
然后,我想要一个函数,它基本上可以采用这些结构中的任何一个,遍历字段(使用reflect),并对每个字段执行某些操作。
我试过一个函数,interface{}但问题是你必须对参数进行类型断言才能访问任何字段。即使有了它,您仍然必须为每种类型/模型编写单独的函数。:
func GenerateLinksHelper(m interface{}) {
...
}
Run Code Online (Sandbox Code Playgroud)
最终,我试图找到一种方法来编写一个函数,该函数接受一个有点任意的结构并对可能存在或不存在的字段执行操作。
我不确定你想要做什么,但是通过反思,你可以看到一个字段是否存在,然后用它做一些事情。
示例源自“反射定律”文章 ( http://blog.golang.org/laws-of-reflection )。播放: http: //play.golang.org/p/neU3j2MYvz
package main
import (
"fmt"
"reflect"
)
type T1 struct {
A int
B string
}
type T2 struct {
A int
}
func fct(i interface{}) {
s := reflect.ValueOf(i).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
if typeOfT.Field(i).Name == "B" {
fmt.Printf("I am %s and I have a field B: %s\n", typeOfT.Name(), f.Interface())
}
}
}
func main() {
t1 := T1{23, "skidoo"}
t2 := T2{23}
fct(&t1)
fct(&t2)
}
Run Code Online (Sandbox Code Playgroud)