【发布时间】:2018-03-07 22:40:34
【问题描述】:
我有一个struct,它有一个或多个struct 成员。每个成员都应该实现一个Validator 接口。
我想使用反射来遍历所有struct 成员并调用接口的Validate() 方法。例如:
package main
import "fmt"
import "reflect"
type Validator interface {
Validate()
}
type T1 struct {
S string
}
func (p *T1) Validate() {
fmt.Println("HERE 1")
}
type T2 struct {
S string
}
func (p *T2) Validate() {
fmt.Println("HERE 2")
}
type Top struct {
S1 T1
S2 T2
}
func main() {
var t Top
r := reflect.ValueOf(t)
for i := 0; i < r.NumField(); i++ {
f := r.Field(i)
if f.Kind() == reflect.Struct {
validator := f.Interface().(Validator)
validator.Validate()
}
}
}
运行时输出:
panic:接口转换:main.T1 不是 main.Validator:缺少方法 Validate
如果我将 Validate() 方法更改为接受值(而不是指针)接收器,那么它可以工作。但是,我想使用指针接收器,因为 structs 可能会变得很大。
如何更改反射代码以使其在定义方法时使用指针接收器?
我也试过用这条线:
validator := f.Addr().Interface().(Validator)
获取一个指针,然后输出:
恐慌:reflect.Value.Addr 的不可寻址值
【问题讨论】:
标签: go methods struct reflection interface