go - 如何使用反射创建参数实体
问题描述
package main
import (
"fmt"
"reflect"
)
type Aservice struct {
}
type Adata struct {
msg string
}
type Bdata struct {
more string
}
var amap map[string]interface{} = make(map[string]interface{}, 1024)
func (aser *Aservice) Bar(data *Adata) error {
return nil
}
func (aser *Aservice) Foo(data *Bdata) error {
return nil
}
func main() {
var ser *Aservice
typeOfService := reflect.TypeOf(ser)
valueOfService := reflect.ValueOf(ser)
for i := 0; i < valueOfService.NumMethod(); i++ {
nref := valueOfService.Method(i).Type().In(0)
fmt.Println("++", nref.Elem().Name())
amap[typeOfService.Method(i).Name] = nref
}
}
目前可以正确打印“Adata”和“Bdata”
但是我不知道如何将“Adata”和“Bdata”的空结构指针存储在amap中
不知道下一步
我想在amap中使用Method(i).Name()来存储Method需要传入的参数
解决方案
根据评论中的建议:
package main
import (
"fmt"
"reflect"
)
type Aservice struct {
}
type Adata struct {
msg string
}
type Bdata struct {
more string
}
var amap = map[string]interface{}{}
func (aser *Aservice) Bar(data *Adata) error {
return nil
}
func (aser *Aservice) Foo(data *Bdata) error {
return nil
}
func main() {
var ser *Aservice
typeOfService := reflect.TypeOf(ser)
valueOfService := reflect.ValueOf(ser)
for i := 0; i < valueOfService.NumMethod(); i++ {
nref := valueOfService.Method(i).Type().In(0)
amap[typeOfService.Method(i).Name] = reflect.New(nref.Elem()).Interface()
}
for k, v := range amap {
fmt.Printf("%s %#v\n", k, v)
}
}
输出:
Bar &main.Adata{msg:""}
Foo &main.Bdata{more:""}
推荐阅读
- python - 如何将结果转换为可用作输入的变量列表?
- flutter - 如何在使用 TabBarView 切换选项卡之前发出 http 请求
- reactjs - 无法让 Popover 在对话框中的正确位置显示
- python - 使用 Python 中的 NewsPaper 库将新闻文章抓取到一个列表中?
- python - 按 ID 显示内容 (views.py)
- javascript - 当我在 Repl.it 软件中运行我的代码时,它无法识别我的任何变量
- ios - 是否有显示模态视图指示器的标准方法?
- stream - Ada - 如何显式打包位字段记录类型?
- javascript - Javascript在html进度标签上获取mousemove clientX值
- c# - API 添加了几条记录而不是一条