【问题标题】:How to call a field method using reflection如何使用反射调用字段方法
【发布时间】:2020-12-23 04:12:23
【问题描述】:

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

【问题讨论】:

  • 如果你有很多不同的结构包含相同签名的函数,也许你应该将这些函数重构为方法,然后创建一个捕获行为的接口。那么你根本不需要反思。请记住,空界面不携带任何信息。

标签: go reflect


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多