Go语言如何遍历接口方法,基于xmlquery实现XML文件批量校验
Go XML校验方法遍历实现方案
你要的遍历调用所有校验方法的逻辑有两种实现方式,如下:
方案1:反射实现(兼容你现有接口定义)
首先修正你代码里的小问题:xmlquery.Parse返回值为*xmlquery.Node,原有自定义node类型的定义可以直接替换为对应指针类型。反射调用逻辑如下:
package main import ( "fmt" "reflect" "github.com/antchfx/xmlquery" ) type XmlChecks interface { checkUTC() (string, string) checkSugPresDel() (string, string) checkStartNum() (string, string) // 新增校验方法只需在这里加定义 } type XmlVerify struct { doc *xmlquery.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 var err error vrfy.doc, err = xmlquery.Parse("myfile.xml") if err != nil { panic(err) } // 以下为WANT位置的实现逻辑 checkerType := reflect.TypeOf((*XmlChecks)(nil)).Elem() checkerVal := reflect.ValueOf(vrfy) for i := 0; i < checkerType.NumMethod(); i++ { method := checkerVal.Method(i) res := method.Call(nil) checkName := res[0].String() checkResult := res[1].String() fmt.Printf("%s %s\n", checkName, checkResult) } }
该方案适配你现有接口设计,但反射存在额外性能开销,且编译期无法校验方法签名匹配性
方案2:校验规则列表实现(更推荐,无反射开销)
无需定义接口,直接把所有校验规则存入切片,新增校验项只需新增函数并加入切片即可,维护更简单:
package main import ( "fmt" "github.com/antchfx/xmlquery" ) type XmlVerify struct { doc *xmlquery.Node } // 定义校验函数类型 type CheckFunc func(xver XmlVerify) (checkName string, result string) // 所有校验规则列表 var checkRules = []CheckFunc{ func(xver XmlVerify) (string, string) { // checkUTC逻辑 return "cUTC", "pass" }, func(xver XmlVerify) (string, string) { // checkSugPresDel逻辑 return "cSugPresDel", "pass" }, func(xver XmlVerify) (string, string) { // checkStartNum逻辑 return "cStartNum", "pass" }, // 新增校验规则直接在这里加函数即可 } func main() { var vrfy XmlVerify var err error vrfy.doc, err = xmlquery.Parse("myfile.xml") if err != nil { panic(err) } // 遍历调用所有校验规则 for _, check := range checkRules { name, res := check(vrfy) fmt.Printf("%s %s\n", name, res) } }
该方案性能更高,新增校验项不需要修改接口定义,编译期可直接校验函数签名正确性
内容的提问来源于stack exchange,提问作者int
相关产品推荐
相关产品推荐

