go - 如何调用 golang struct 字段的函数?
问题描述
package main
import "fmt"
import "reflect"
type T struct{}
func (t *T) Foo() {
fmt.Println("foo")
}
type A struct {
Ts T
}
func main() {
var t T
var a A = A{Ts: t}
val := reflect.ValueOf(&a).Elem()
for i := 0; i < val.NumField(); i++ {
vf := val.Field(i).Addr()
fmt.Println(vf.Type())
fmt.Println(vf.Kind())
reflect.ValueOf(vf).MethodByName("Foo").Call([]reflect.Value{})
}
}
$ go run reflect_call_1.go
*main.T ptr panic: reflect: call of reflect.Value.Call on zero Valuegoroutine 1 [运行]: reflect.flag.mustBe(0x0, 0x13)
/usr/local/go/src/reflect/value.go:201 +0xae reflect.Value.Call(0x0, 0x0, 0x0, 0xc420049f00, 0x0, 0x0, 0x0, 0x0, 0x40457c)
/usr/local/go/src/reflect/value.go:300 +0x38
解决方案
vf
已经是 type reflect.Value
,您不必将其传递给另一个reflect.ValueOf()
调用。
只需致电MethodByName()
:vf
vf.MethodByName("Foo").Call([]reflect.Value{})
输出将是(在Go Playground上尝试):
*main.T
ptr
foo
推荐阅读
- git - 是否有使用 git 存储“主代码”的选项?
- php - 如何从 Laravel 日期范围内未创建的数据库中获取记录?
- swift - 带有 AVAudioPlayerNode 的 SpriteKit 位置音频
- multithreading - 具有最大缓冲区大小问题的 1 个生产者 2 个消费者的最优控制
- javascript - React Hooks 立即更新状态
- azure - Azure Application Insight Application Map 不显示 grpc 微服务之间的请求
- drupal - Drupal 8 - 钩子网络表单选项 WEBFORM OPTIONS ID alter()
- r - 获取变量随时间的累积比例
- javascript - 如何根据 JavaScript 中的整数值将对象键多次推送到数组
- api - 如何按主题过滤和获取 GitHub 存储库