我有很多这样的结构,带有差异字段但有共同字段:fn func()
type a struct{
// ....
fn func()
}
我要的是调用diff structs'实例的fn函数,如何实现;不用receiver func实现,fn没有导出
func call(i interface{}){
// TODO
// how to use reflect to call fn func
}
如果您没有使用动态分配功能,那么您可以继续使用接口;您还可以创建接口方法调用结构字段方法的逻辑;我建议使用方法和接口
package main
import (
"fmt"
)
type A struct {
}
type myInterface interface {
fn()
}
func (a *A) fn(){
fmt.Println("Hello, playground")
}
func main() {
var i myInterface
i = &A{}
call(i)
}
func call(input myInterface) {
input.fn()
}
但是如果你想使用反射调用字段方法,你可以做这样的事情;但是该字段Fn
需要导出
package main
import (
"fmt"
"reflect"
)
type A struct {
Fn func()
}
func main() {
a := A{func() { fmt.Println("Hello!!!") }}
call(a)
}
func call(i interface{}) {
valOf := reflect.ValueOf(i)
valOf.FieldByName("Fn").Call([]reflect.Value{})
}