You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:15:02