在运行时解析传递给函数的结构体。

huangapple go评论127阅读模式
英文:

Resolve the struct passed to a function in Runtime

问题

我有一个实现了简化的Active Record类似实现的接口,用于我的持久层。

  1. type DBInterface interface {
  2. FindAll(collection []byte) map[string]string
  3. FindOne(collection []byte, id int) map[string]string
  4. Destroy(collection []byte, id int) bool
  5. Update(collection []byte, obj map[string]string) map[string]string
  6. Create(collection []byte, obj map[string]string) map[string]string
  7. }

应用程序与不同的集合进行通信,并有不同的对应模型。我希望能够传递一个动态的结构体,而不是一个map作为值obj(即Update,Create的参数)。

我似乎无法理解如何使用反射来解析结构体,希望能得到一些指导。

我试图解释一下我所尝试的内容:

考虑以下来自https://labix.org/mgo的mgo示例片段:

  1. err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
  2. &Person{"Cla", "+55 53 8402 8510"})

当我们向集合插入数据时,我们使用&Person。我希望能够传递这部分&Person{"Ale", "+55 53 8116 9639"},但接收该值的方法只能在运行时知道它。因为它可能是一个Person、Car、Book等结构体,具体取决于调用该方法的函数。

英文:

I have the below interface that implements a simpler Active Record Like implementation for my persistent layer.

  1. type DBInterface interface {
  2. FindAll(collection []byte) map[string]string
  3. FindOne(collection []byte, id int) map[string]string
  4. Destroy(collection []byte, id int) bool
  5. Update(collection []byte, obj map[string]string ) map[string]string
  6. Create(collection []byte, obj map[string]string) map[string]string
  7. }

The application has different collection's that it talks to and different corresponding models. I need to be able to pass in a dynamic Struct , instead of a map for the value obj ( ie. Update , Create Signatures )

I can't seem to understand how to use reflection to resolve the Struct , any guidance would help.

More details on what I am trying explain :

Consider the below snippet from mgo example from https://labix.org/mgo

  1. err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
  2. &Person{"Cla", "+55 53 8402 8510"})

When we insert data to the collection , we do a &Person I want to be able to pass in this bit &Person{"Ale", "+55 53 8116 9639"} but the method receiving the would only know it in the Run time. Because it could be a Person , Car , Book etc Struct depending on the func calling the method

答案1

得分: 1

  1. 将你的对象类型声明为 interface{}

    1. Update(collection []byte, obj interface{}) map[string]string
  2. 现在你可以将 Person、Book、Car 等作为 obj 传递给这个函数。

  3. 在 Update 函数内部使用类型切换来处理每个实际的结构体

    1. switch t := obj.(type){
    2. case Car://处理 Car 类型
    3. case Person:
    4. case Book:
    5. }

在 Go 中,结构体需要在编译时确定。Go 中没有动态类型,甚至接口也是静态类型的。

英文:
  1. Declare your obj type as interface{}

    1. Update(collection []byte, obj interface{} ) map[string]string
  2. Now you can pass Person,Book,Car etc to this function as obj.

  3. Use a type switch inside Update function for each actual struct

    1. switch t := obj.(type){
    2. case Car://Handle Car type
    3. case Perosn:
    4. case Book:
    5. }

Structs needs to be decided at compile time.No dynamic types in Go.Even interfaces are static types.

huangapple
  • 本文由 发表于 2015年8月10日 23:43:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/31923818.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定