【问题标题】:Iterate through all the methods using range for loop使用 range for 循环遍历所有方法
【发布时间】:2019-08-30 08:41:32
【问题描述】:

我有一个结构,其中定义了方法,我想遍历所有方法。我可以使用 interface {} 或任何其他方式来实现吗?

type SomeStruct struct {
   m_boolVals []bool
   m_stringVals []string
   m_intVals []int64
   }

func (m *SomeStruct) GetBool() []bool {
    return m.m_boolVals
}

func (m *SomeStruct) GetString() []string {
    return m_stringVals
}

func (m *SomeStruct) GetInts() []int64 {
    return m_intVals 
}

有没有办法实现下面的代码?所以基本上只有一个 value 会出现

fun SomeOtherFunc(ss *SomeStruct) []string {
    var final_string []string
    for _, handlerFunc := range(ss.GetBool, ss.GetString, ss.GetInts) {
        generic_vals := handlerFunc()
        if (len(generic_vals) > 0) {
            for _, t_val := range(generic_vals)  {
                final_string = append(final_string , string(t_val))
            }
            break
        }
    }
    return final_string
}

【问题讨论】:

  • 您可以获取所有方法并对其进行迭代,甚至可以使用反射调用它们。适合你吗?
  • 你有示例吗?
  • 这有一个使用反射获取方法名称的示例stackoverflow.com/questions/21397653/…
  • @user8351493 - 这看起来不错......但我怎么称呼它们(那些方法)?

标签: go


【解决方案1】:

这是一个示例,您可以如何使用反射来迭代方法并调用每个方法,并将其结果转换为string

func SomeOtherFunc(ss *SomeStruct) []string {
    var result []string
    v := reflect.ValueOf(ss)
    for i := 0; i < v.NumMethod(); i++ {
        for _, res := range v.Method(i).Call(nil) {
            result = append(result, fmt.Sprint(res.Interface()))
        }
    }
    return result
}

测试它:

fmt.Println(SomeOtherFunc(&SomeStruct{
    m_boolVals:   []bool{true, false},
    m_stringVals: []string{"one", "two"},
    m_intVals:    []int64{1, 2, 3},
}))

哪些输出(在Go Playground 上试试):

[[true false] [1 2 3] [one two]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多