使用反射,如何动态创建结构“类型”?

时间:2018-07-19 16:31:26

标签: go reflection

考虑以下结构:

type Foo struct{}

func (f *Foo) foo() {
    fmt.Println("Hello")
}

使用反射,我想生成一个覆盖一组方法的自定义结构类型。 手动进行工作时,我想做的是:

type Edit struct{
    Foo
}

func (e *Edit) foo() {
    e.Foo.foo()
    fmt.Println("World")
}

但是我不想创建一个函数,它可以对任何给定的结构自动进行此类覆盖。


我知道我可以使用以下方法实例化一个结构:

res := reflect.New(reflect.TypeOf(origin))

但是在这种情况下,我们无法编辑方法。

那么,如何通过反射创建一个结构类型,该结构类型可以像上面说明的那样包装现有类型?

1 个答案:

答案 0 :(得分:0)

您可以实现与使用Method Values所要求的极其相似的东西。您可以执行以下操作:

package main

import (
    "fmt"
)

type Foo struct {
    sayHelloAgain func()
}

func (f *Foo) SayHello() { 
    fmt.Print("Hello,")
    f.sayHelloAgain() 
}

func main() {
    edit := struct{Foo}{}
    edit.sayHelloAgain = func(){ fmt.Println(" World!") }
    edit.SayHello()

}

Go Playground

如您所见,您可以创建一个匿名结构,该结构将能够调用SayHello函数,然后该函数将调用接收者的动态设置sayHelloAgain方法。

我认为这将是您最接近目标的方法,并且可以按您的要求工作(无需relection