gpt4 book ai didi

reflection - 通过反射获取阴影方法

转载 作者:IT王子 更新时间:2023-10-29 01:03:24 26 4
gpt4 key购买 nike

我怎样才能通过反射获得阴影方法?

在下面的代码中,我使用了 MethodByName获取 B 类型的方法 Test(),但我想从 b.A Test(),所以我可以同时调用它们。

package main

import (
"fmt"
"reflect"
)

type A struct {}
type B struct {
A
}

func (self *A) Test() {
fmt.Println("I'm A")
}
func (self *B) Test() {
fmt.Println("I'm B")
}

func main() {
b := &B{}
b.Test() // This one shadows b.A.Test()
b.A.Test() // but its ok to call like this

// via reflection
val := reflect.ValueOf(b)
val.MethodByName("Test").Call([]reflect.Value{})
}

此处提供代码:http://play.golang.org/p/6YPLy2dmMb

最佳答案

如果你有一个嵌入式结构和阴影,你总是可以得到这个字段,就好像它是一个与嵌入式结构的类型同名的成员变量,这在你的 b.A.Test() 行中显示。

那我们怎么办?使用 reflect.Value.FieldByName 获取字段。使用您的确切设置,它有点笨拙。您不能在指向结构的指针上使用 FieldByName。

package main

import (
"fmt"
"reflect"
)

type A struct{}
type B struct {
A
}

func (self *A) Test() {
fmt.Println("I'm A")
}
func (self *B) Test() {
fmt.Println("I'm B")
}

func main() {
b := &B{}
b.Test()
b.A.Test()

val := reflect.ValueOf(b)
subVal := val.Elem().FieldByName("A").Addr()
subVal.MethodByName("Test").Call([]reflect.Value{})
val.MethodByName("Test").Call([]reflect.Value{})
}

如图所示,有点丑。首先需要调用Elem获取val指向的值,然后获取字段,然后获取指向该字段的指针,因为A.Test 实际上在 (*A) 上,而不是 A。虽然 Go 指针通常是透明的,但它不适用于反射,不幸的是,因此您必须自己进行所有显式寻址/取消引用,但如果您了解指针,那就非常简单了。

编辑:Playground link to the code above

关于reflection - 通过反射获取阴影方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22373953/

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