使用范围循环遍历所有方法

时间:2019-08-30 08:41:32

标签: go

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

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 
}

有没有办法实现下面的代码?因此,基本上只有一种价值存在

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
}

1 个答案:

答案 0 :(得分:2)

这是一个示例,您可以使用反射来遍历方法并调用每个方法,然后将其结果转换为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]]