【问题标题】:how to using reflect to create parametric entity如何使用反射创建参数实体
【发布时间】:2021-03-26 09:22:43
【问题描述】:
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需要传入的参数

【问题讨论】:

  • 要获取给定指针类型的nil 值,您可以执行reflect.New(t).Elem().Interface(): play.golang.org/p/2Hl_CFtf7Yb
  • @mkopriva 如果我希望指针为零怎么办?
  • 这就是操场上的代码所产生的,不是吗?
  • 我预计结果会像Bar &amp;main.Adata{msg:""}
  • 要获得指向空结构的指针,您可以这样做:reflect.New(t.Elem()).Interface()

标签: go reflect


【解决方案1】:

根据 cmets 中的建议:

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

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多