草庐IT

golang 反射(reflect)到 []interface{}

coder 2024-07-05 原文

我想创建一个迷你框架,它采用一个简单的结构并从中创建一个完整的 crud。我已经开始了,“findOne、更新、创建、删除”正在运行。不是我在创建 findAll 方法时遇到问题。更清楚地说,我不知道如何使用反射将我的 ptr 寻址到结构数组。

这里是 findOne 函数的一个小例子。

type company struct {
Id          int
Name        string
}

comp.InitModel(newDbConnection(), &comp)

在 InitModel 中,我可以用以下内容填充指向公司的指针:

//m.caller = pointer to the ptr to comp (struct)
callerV := reflect.ValueOf(m.caller)
CallerField := callerV.Elem()
var values []interface{}
for _, e := range m.columns {
    values = append(values, CallerField.FieldByName(e.name).Addr().Interface())
}
err := r.Scan(values...)
if err != nil {
    return err
}

现在我想创建一个像这样调用的 findAll 方法

var companies []company
comp.InitModel(newDbConnection(), &comp)
comp.FindAll(&companies) //in this is the db query and scan
fmt.Println(companies) //here should be the result

但我在使用 [] 接口(interface)工作时遇到问题。

func (m *Model) FindAll(test []interface{}, c *Condition) error {

//get the sql statement from the struct
stmt := PrepairStmt(m, c)

rows, err := m.db.Query(stmt.selectParse(), c.arguments...)
if err != nil {
    return err
}
defer rows.Close()

callerV := reflect.ValueOf(m.caller)
CallerField := callerV.Elem()
for rows.Next() {

    var values []interface{}
    for _, e := range m.columns {
        values = append(values, CallerField.FieldByName(e.name).Addr().Interface())
    }

    err = rows.Scan(values...)
    if err != nil {
        return err
    }

    valuePtr := reflect.New(reflect.TypeOf(test).Elem())
    test = reflect.Append(test,reflect.ValueOf(values))
}

return nil
}

那是我最近的尝试。 也许有人可以帮助我。 我真的很感激

最佳答案

使用 interface{} 而不是 []interface{} 作为参数类型:

func (m *Model) FindAll(result interface{}, c *Condition) error {
  stmt := PrepairStmt(m, c)
  rows, err := m.db.Query(stmt.selectParse(), c.arguments...)
  if err != nil {
    return err
  }
  defer rows.Close()

  // resultv is the result slice
  resultv := reflect.ValueOf(result).Elem()

  // rowt is the struct type
  rowt := resultv.Type().Elem()

  // allocate a value for the row
  rowv := reflect.New(rowt).Elem()

  // collect values for scan
  var values []interface{}
  for _, e := range m.columns {
      values = append(values, rowv.FieldByName(e.name).Addr().Interface())
  }

  for rows.Next() {

    err = rows.Scan(values...)
    if err != nil {
      return err
    }

    // Append struct to result slice. Because the struct
    // is copied in append, we can reuse the struct in 
    // this loop. 
    resultv.Set(reflect.Append(resultv, rowv))
  }
  return nil
}

像这样使用它:

var companies []company
comp.InitModel(newDbConnection(), &comp)
comp.FindAll(&companies) //in this is the db query and scan

关于golang 反射(reflect)到 []interface{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49264525/

有关golang 反射(reflect)到 []interface{}的更多相关文章

  1. ruby-on-rails - 如何在 RubyOnRails 中使用 'acts as nested set' 创建一个可排序的接口(interface) - 2

    我一直在为使用acts_as_list的模型实现一些不错的交互界面,这些界面可以对我的mRails应用程序中的列表进行排序。我有一个排序函数,在每次拖放之后使用sortable_elementscript.aculo.us函数调用并设置每条记录的位置。这是在拖放完成后处理排序的Controller操作示例:defsortparams[:documents].each_with_indexdo|id,index|Document.update_all(['position=?',index+1],['id=?',id])endend现在我正在尝试对嵌套集模型(acts_as_nested

  2. ruby-on-rails - 使用模型属性调用的 Brakeman 不安全反射方法常量化 - 2

    在我的Rails应用程序中,我收到来自brakeman的以下安全警告。使用模型属性调用的不安全反射方法常量化。这是我的代码正在执行的操作。chart_type=Chart.where(id:chart_id,).pluck(:type).firstbeginChartPresenter.new(chart_type.camelize.constantize.find(chart_id))rescueraise"Unabletofindthechartpresenter"end根据我的研究,我还没有找到任何具体的解决方案。我听说你可以创建一个白名单,但我不确定brakeman在寻找什么。

  3. ruby - ruby 的反射? - 2

    我很好奇这是如何工作的。例如,如果我创建一个基于工厂模式的类,您可以在其中“注册”类供以后使用,然后执行类似FactoryClass.register('YourClassName',[param,param,...]);FactoryClass.create('your_class_name').call_method_from_this_object其中'class_name'是映射到值的散列中的键:ClassName有没有类似phpreflection的东西,我可以在哪里创建基于字符串名称的类的实例并传入参数?(在php中,参数将是它们的数组,php然后知道如何处理)所以如果我们

  4. ruby-on-rails - 在 Ruby on Rails 中为由外部 API 支持的模型使用 ActiveRecord 接口(interface) - 2

    我正在尝试在我的Rails应用程序中使用模型来从外部API检索信息。我想做的是以类似于ActiveRecord模型提供的方式(特别是关联,以及相同风格的可链接查询方法)访问我的数据模型(可能包含来自多个API调用的信息)。我最初的直觉是重新创建我想要的ActiveRecord部分并合并此API。不想“重新发明轮子”并确切地看到添加更多功能需要多少工作让我退后一步并重新评估如何处理这个问题。我找到了在没有表的情况下使用ActiveRecord的方法(请参阅:Railscast#193TablelessModel和博客文章here)并研究了ActiveRecord。因为ActiveMode

  5. ruby - Interface Builder 看不到 MacRuby 的 socket - 2

    我正在尝试使用XCode和InterfaceBuilder构建一个基本的helloworld应用程序。但是,在InterfaceBuilder中,我看不到我的socket可以连接起来。我转到对象检查器Pane的连接选项卡,它显示“NewReferencingOutlet”。我想知道我的代码是否有误。在这里classHelloWorldControllerattr_accessor:hello_label,:hello_button,:hellodefawakeFromNib@hello=trueenddefchangeLabel(sender)if@hello@hello_label.

  6. ruby - 如何使用 Devise 来保护 delayed_job_web 接口(interface)? - 2

    我正在使用delayed_job_webgem来监控延迟的作业。https://github.com/ejschmitt/delayed_job_web可以使用我的routes.rb中的这一行访问它:match"/delayed_job"=>DelayedJobWeb,:anchor=>false我站点的每个其他区域都需要使用Devisegem登录。我如何使它也需要登录?在自述文件中,他们建议将以下内容添加到config.rb:ifRails.env.production?DelayedJobWeb.useRack::Auth::Basicdo|username,password|us

  7. ruby - 在 Ruby 中编写 C 接口(interface)比在 Perl 中更容易吗? - 2

    根据officialrubyAboutpage用C扩展Ruby比用Perl更容易。我不是(perl)XS专家,但我发现使用Inline::C快速简单地编写一些东西非常简单,那么为什么在Ruby中更容易呢?WritingCextensionsinRubyiseasierthaninPerlorPython,withaveryelegantAPIforcallingRubyfromC.ThisincludescallsforembeddingRubyinsoftware,foruseasascriptinglanguage.ASWIGinterfaceisalsoavailable.那些做

  8. ruby - 为什么 Ruby 人说他们不需要接口(interface)? - 2

    Ruby是否与其他OOP语言(例如:PHP)不同,使接口(interface)变得无用?它有某种替代品吗?编辑:一些说明:在其他语言中(例如:PHP),您并不“需要”接口(interface)(它们在代码级别不是强制性的)。你用它们来订立契约(Contract),改进软件的架构。因此,'在ruby​​中你不需要接口(interface)/在其他语言中你需要接口(interface)因为XXX'的断言是错误的。不,混合不是接口(interface),它们是完全不同的东西(PHP5.4实现了混合)。你用过接口(interface)吗?是的,PHP是OOP。语言不断发展,欢迎来到现在。

  9. ruby - 如何找到 "essential"方法来提供 Ruby mixins 的接口(interface)? - 2

    问题标题的可怕之处是我要解决的问题。示例:在Ruby中,Enumerable是某种意义上的接口(interface),我可以实现某些东西并将其记录为:defmyfancymethod(please_pass_me_an_Enumerable_here)但另一方面,Enumerable是一种接口(interface)的放大,它以#each作为其方法之一。如果我有课classFoodefeach:barendend对于那些不熟悉Ruby的人来说,如果你在一个类中混入Enumerable模块,你会得到许多只依赖于#each方法来提供诸如#map之类的方法,#select等我可以说我的Foo类

  10. ruby - 有没有办法将 Ruby Net::HTTP 请求附加到特定的 IP 地址/网络接口(interface)? - 2

    我正在寻找一种使用标准Net::HTTP库为每个GET请求使用不同IP地址的方法。服务器有5个IP地址,并假设某些API在达到每个IP的请求限制时阻止访问。所以,唯一的办法就是使用另一台服务器。我在ruby​​文档中找不到任何关于它的信息。例如,curl允许您将其附加到特定的ip地址(在PHP中):$req=curl_init($url)curl_setopt($req,CURLOPT_INTERFACE,'ip.address.goes.here';$result=curl_exec($req);有什么方法可以用Net::HTTP库来实现吗?作为替代方案-CURB(rubycurl绑

随机推荐