首页 > 解决方案 > 如何使用反射调用字段方法

问题描述

我有很多这样的结构,带有差异字段但有共同字段: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
}

标签: goreflect

解决方案


如果您没有使用动态分配功能,那么您可以继续使用接口;您还可以创建接口方法调用结构字段方法的逻辑;我建议使用方法和接口

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{})
}

推荐阅读