【问题标题】:Can you pass a struct fieldname in to a function in golang?您可以将结构字段名传递给golang中的函数吗?
【发布时间】:2015-08-27 13:00:18
【问题描述】:

比如说你有这样的东西,试图让这个例子尽可能简单。

type Home struct {
    Bedroom string
    Bathroom string
}

如何将字段名称传递给函数?

func (this *Home) AddRoomName(fieldname, value string) {
    this.fieldname = value
}

显然这不起作用...我能看到的唯一方法是使用两个函数,当结构变得非常大并且有很多类似的代码时,这会添加很多额外的代码。

func (this *Home) AddBedroomName(value string) {
    this.Bedroom = value
}
func (this *Home) AddBathroomName(value string) {
    this.Bathroom = value
}

【问题讨论】:

  • 请问您不使用map[string]string 的原因是什么?我个人会避免使用反射向应用程序添加琐碎的功能,解决方法可能更好。
  • 与我正在尝试做的相比,上面的示例非常简单,但足以说明问题。
  • 看起来可能但值得一问。您可能仍需要在此级别考虑不同的模型。

标签: struct types go func


【解决方案1】:

在接口值上使用类型断言:

package main

import "fmt"

type Test struct {
    S string
    I int
}

func (t *Test) setField(name string, value interface{}) {
    switch name {
        case "S":
            t.S = value.(string)
        case "I":
            t.I = value.(int)
    }
}

func main() {
    t := &Test{"Hello", 0}
    fmt.Println(t.S, t.I)
    t.setField("S", "Goodbye")
    t.setField("I", 1)
    fmt.Println(t.S, t.I)
}

【讨论】:

    【解决方案2】:

    我想到的另一个想法是这样的,但不确定它是否适合您的情况:

    func Set(field *string, value string) {
        *field = value
    }
    
    home := &Home{"asd", "zxc"}
    fmt.Println(home)
    Set(&home.Bedroom, "bedroom")
    Set(&home.Bathroom, "bathroom")
    fmt.Println(home)
    

    http://play.golang.org/p/VGb69OLX-X

    【讨论】:

      【解决方案3】:

      我知道的唯一方法是使用反射:

      func (this *Home) AddRoomName(fieldname, value string) {
          h := reflect.ValueOf(this).Elem()
          h.FieldByName(fieldname).Set(reflect.ValueOf(value))
          return
      }
      

      http://play.golang.org/p/ZvtF_05CE_

      【讨论】:

        猜你喜欢
        • 2017-11-03
        • 1970-01-01
        • 1970-01-01
        • 2013-01-20
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        相关资源
        最近更新 更多