【问题标题】:iterate over all interface methods in go [duplicate]遍历go中的所有接口方法[重复]
【发布时间】:2021-12-12 01:40:45
【问题描述】:

如何对 xml 文件运行一套检查?每一次检查都是一种方法 返回 2 个字符串:它的名称和通过或失败。 使用 xml 查询。我尝试将所有方法放在一个接口中,但是 不知道如何迭代。

在此代码示例中,尝试让评论“WANT”起作用:

package main

import (
        "fmt"
        "github.com/antchfx/xmlquery"
)

type node xmlquery.Node

type XmlChecks interface {
        checkUTC() (string, string)
        checkSugPresDel() (string, string)
        checkStartNum() (string, string)
        // ... there will be many
}

type XmlVerify struct {
        doc node
}

func (xver XmlVerify) checkUTC() (string, string) {
        //TBD
        return "cUTC", "pass"
}

func (xver XmlVerify) checkSugPresDel() (string, string) {
        //TBD
        return "cSugPresDel", "pass"
}

func (xver XmlVerify) checkStartNum() (string, string) {
        //TBD
        return "cStartNum", "pass"
}

func main() {
        var vrfy XmlVerify
        vrfy.doc, _ := xmlquery.Parse("myfile.xml")
        for each_method := range "all the methods in vrfy.XmlChecks" { //<--WANT
                fmt.Printf("%s %s\n", vrfy.each_method()) //<--WANT
        }

}

【问题讨论】:

  • 一个接口只是定义了一个值可以实现的方法集。由于方法必须已经在代码中静态定义,您只需根据需要调用这些方法,您无需“迭代”任何内容。
  • 你是说如果我有 1 或 200 个方法,那么在主函数中我需要单独调用它们中的每一个,对吗?因为我“不需要“迭代”任何东西”
  • 这么多方法是非常不寻常的,但如果你有这么多方法,我认为它们是以某种方式生成的,调用站点也可以生成?如果你想列出一个类型的方法,你当然可以使用reflect
  • 好建议。谢谢

标签: loops go interface iterator


【解决方案1】:

这是一个示例,说明如何使用 reflect 进行操作。仅更改了 XmlVerify 中的值以使示例更容易一些。还要确保方法名称已导出(大写)。

package main

import (
    "fmt"
    "reflect"
)

type XmlVerify struct {
    value string
}

func (xver XmlVerify) CheckUTC() (string, bool) {
    return "cUTC", xver.value == "one"
}

func (xver XmlVerify) CheckSugPresDel() (string, bool) {
    return "cSugPresDel", xver.value == "two"
}

func (xver XmlVerify) CheckStartNum() (string, bool) {
    return "cStartNum", xver.value == "three"
}

func verify(xmlverify XmlVerify) {
    t := reflect.TypeOf(xmlverify)

    for i := 0; i < t.NumMethod(); i++ {
        method := t.Method(i)
        ret := reflect.ValueOf(xmlverify).MethodByName(method.Name).Call(nil)
        fmt.Printf("%s checks passed: %t\n", ret[0], ret[1])
    }
}

func main() {
    v := XmlVerify{"two"}
    verify(v)
}

输出:

cStartNum checks passed: false
cSugPresDel checks passed: true
cUTC checks passed: false

【讨论】:

  • 这行得通,谢谢。在这种情况下根本不需要接口。
猜你喜欢
  • 2017-09-29
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2017-09-08
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
相关资源
最近更新 更多