首页 > 解决方案 > 如何使用反射创建参数实体

问题描述

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需要传入的参数

标签: goreflect

解决方案


根据评论中的建议:

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:""}

推荐阅读