草庐IT

Reflection

全部标签

go - 如何通过反射初始化结构指针

我的目标是获取一个指向结构(但可以是任何类型)的nil指针,作为interface{}传递,并在其位置初始化一个结构.我的测试代码(playgroundlink)是:packagemainimport("fmt""reflect")typeFoostruct{Foostring}funcmain(){varx*Foovaryinterface{}=xfmt.Printf("Before:%#v\n",y)fmt.Printf("Goal:%#v\n",interface{}(&Foo{}))rv:=reflect.ValueOf(y)rv.Set(reflect.New(rv.Type

go - 如何通过反射初始化结构指针

我的目标是获取一个指向结构(但可以是任何类型)的nil指针,作为interface{}传递,并在其位置初始化一个结构.我的测试代码(playgroundlink)是:packagemainimport("fmt""reflect")typeFoostruct{Foostring}funcmain(){varx*Foovaryinterface{}=xfmt.Printf("Before:%#v\n",y)fmt.Printf("Goal:%#v\n",interface{}(&Foo{}))rv:=reflect.ValueOf(y)rv.Set(reflect.New(rv.Type

unit-testing - 带有 `time.Time` 的 Go 类型开关

在我的测试中,我有一个函数可以从这样的结构中获取值:funcgetField(vinterface{},fieldstring)string{r:=reflect.ValueOf(v)f:=reflect.Indirect(r).FieldByName(field)t:=f.Kind()switcht{casereflect.Int,reflect.Int64:returnstrconv.FormatInt(f.Int(),10)casereflect.String:returnf.String()casereflect.Bool:iff.Bool(){return"true"}ret

unit-testing - 带有 `time.Time` 的 Go 类型开关

在我的测试中,我有一个函数可以从这样的结构中获取值:funcgetField(vinterface{},fieldstring)string{r:=reflect.ValueOf(v)f:=reflect.Indirect(r).FieldByName(field)t:=f.Kind()switcht{casereflect.Int,reflect.Int64:returnstrconv.FormatInt(f.Int(),10)casereflect.String:returnf.String()casereflect.Bool:iff.Bool(){return"true"}ret

go - 执行不接受参数的方法

给定结构的任意实例,我希望能够执行其所有不接受参数的公共(public)方法。例如在下面的代码中,我希望能够在不知道X{}.Foo()和X{}.Bar()存在的情况下执行它们。packagemainimport("fmt""reflect")typeXstruct{Ystring}func(xX)Foo()string{returnx.Y}func(xX)Bar(){}func(xX)Baz(qstring){}funcmain(){fooType:=reflect.TypeOf(X{})fori:=0;i 最佳答案 更改refle

go - 执行不接受参数的方法

给定结构的任意实例,我希望能够执行其所有不接受参数的公共(public)方法。例如在下面的代码中,我希望能够在不知道X{}.Foo()和X{}.Bar()存在的情况下执行它们。packagemainimport("fmt""reflect")typeXstruct{Ystring}func(xX)Foo()string{returnx.Y}func(xX)Bar(){}func(xX)Baz(qstring){}funcmain(){fooType:=reflect.TypeOf(X{})fori:=0;i 最佳答案 更改refle

go - 如何提取自己的符号表

我正在查看debug/gosym包,它的类型为gosym.Table,据称是Go可执行文件的符号表。不幸的是,我没有看到任何从正在运行的程序中提取sysmbol表的方法(缺少Go反射,我需要比它能提供的更多的信息,特别是导出符号的名称)。如果这通常不可能,但可以在Linux上/对于ELF二进制文件完成,那也是一种选择。 最佳答案 在go(Linux)中获取当前运行进程的符号表:varsymTable*gosym.TablevarsymTableLoadFailedboolfuncloadSymbolTableLinux(){ifsy

go - 如何提取自己的符号表

我正在查看debug/gosym包,它的类型为gosym.Table,据称是Go可执行文件的符号表。不幸的是,我没有看到任何从正在运行的程序中提取sysmbol表的方法(缺少Go反射,我需要比它能提供的更多的信息,特别是导出符号的名称)。如果这通常不可能,但可以在Linux上/对于ELF二进制文件完成,那也是一种选择。 最佳答案 在go(Linux)中获取当前运行进程的符号表:varsymTable*gosym.TablevarsymTableLoadFailedboolfuncloadSymbolTableLinux(){ifsy

go - 在 Go 中使用反射设置嵌套结构字段的值

我正在尝试创建一个protobuf结构typeFlatMessagemap[string][]byte我正在努力设置嵌套字段的值。我有一个func(fm*FlatMessage)Unflatten()(pb.Message,error)将平面消息转换为结构化protobuf的方法。我还有一个名为analyze的辅助函数它采用pb.Message类型的结构并返回map[int]*ProtoField其中:typeProtoFieldstruct{NamestringTypereflect.Type}即analyze遍历pb.Message递归地收集我需要的所有信息。到目前为止,一切都很好

go - 在 Go 中使用反射设置嵌套结构字段的值

我正在尝试创建一个protobuf结构typeFlatMessagemap[string][]byte我正在努力设置嵌套字段的值。我有一个func(fm*FlatMessage)Unflatten()(pb.Message,error)将平面消息转换为结构化protobuf的方法。我还有一个名为analyze的辅助函数它采用pb.Message类型的结构并返回map[int]*ProtoField其中:typeProtoFieldstruct{NamestringTypereflect.Type}即analyze遍历pb.Message递归地收集我需要的所有信息。到目前为止,一切都很好