按名称调用 Go 结构体及其方法
在 Go 中处理反射时,可能会遇到需要调用结构体的方法的情况。结构体按其名称。我想到的是 Reflect 包中的 MethodByName() 函数,但它的用法可能不会立即显而易见。本文旨在提供一种按名称调用结构体及其方法的简化方法。
MethodByName() 和 StructByName()
需要 StructByName() 的误解在调用 MethodByName() 之前是不正确的。 MethodByName() 可以直接用来检索所需的方法。
按名称调用结构体方法
下面是一个示例,说明如何按名称调用结构体方法:
type MyStruct struct { //some feilds here } func (p *MyStruct) MyMethod() { println("My statement.") } // Notice there is no StructByName() function call here CallFunc("MyStruct", "MyMethod") // prints "My statement."
在此示例中,方法 MyMethod 在 *MyStruct 的实例上调用,该实例是
基于反射的方法
这是一种基于反射的方法,通过名称调用结构体方法:
package main import "fmt" import "reflect" type T struct { } func (t *T) Foo() { fmt.Println("foo") } func main() { t := &T{} reflect.ValueOf(t).MethodByName("Foo").Call([]reflect.Value{}) }
此方法利用Reflect.ValueOf 获取一个 Value 对象,该对象代表 struct 的实例。然后使用 MethodByName() 检索所需的方法,随后使用 Call() 调用该方法。
以上是如何使用反射按名称调用 Go 结构体方法?的详细内容。更多信息请关注PHP中文网其他相关文章!