遍历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
如何 运行 对 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