遍历go中的所有接口方法

iterate over all interface methods in go

如何 运行 对 xml 文件进行一套检查?每一个检查都是一个方法 returns 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
        }

}

这是一个如何使用 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