gpt4 book ai didi

go - 使用反射,如何动态创建结构 "type"?

转载 作者:IT王子 更新时间:2023-10-29 02:20:37 27 4
gpt4 key购买 nike

考虑以下结构:

type Foo struct{}

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

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

type Edit struct{
Foo
}

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

但是我不想手动编写这个,而是想创建一个函数来自动覆盖任何给定的结构。


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

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

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

那么我如何使用 reflect 创建一个结构类型来包装现有类型,就像上面解释的那样?

最佳答案

您可以使用 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)

关于go - 使用反射,如何动态创建结构 "type"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51427746/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com