【问题标题】:golang how can I use struct name as map keygolang如何使用结构名称作为映射键
【发布时间】:2021-09-16 12:46:48
【问题描述】:
type A struct {
    a1 int
    a2 string
}
type B struct {
    b1 int
    b2 string
}
type C struct {
    c1 int
    c2 string
}

有 3 个结构,我想把名字作为键放入映射中,并将 func 作为映射值处理

(而不是类型切换)

input arg是一个接口,用for循环判断这个接口是什么struct。并通过 map 值中的 process func 处理此 arg。 关于:

var funcMap map[structName]func(arg){A:processA, B:processB, C:processC}

func testFunc(arg) {
    for k, v in range funcMap {
        if k == reflect.TypeOf(arg) {
            v(arg)
        }
    }
} 

我怎样才能建立这个地图???希望代码,谢谢! (^o^)

【问题讨论】:

标签: go


【解决方案1】:

您想在reflect.Type 上为您的地图编制索引:

type funcMapType map[reflect.Type]func(interface{})

var funcMap funcMapType

然后用函数注册一个类型:

funcMap[reflect.TypeOf(A{})] = func(v interface{}) { log.Println("found A") }

如果你的函数需要修改结构,你需要注册一个指向结构类型的指针:

funcMap[reflect.TypeOf(&A{})] = func(v interface{}) { log.Println("found *A") }

https://play.golang.org/p/LKramgSc_gz

【讨论】:

  • 对于其他读者:不要忘记reflect.TypeOf(A{}) != reflect.TypeOf(&A{})。类型必须是identical
  • 如何处理指向结构的指针作为键?示例:*A?
  • @xiangyuhaoaizcm 用指针逻辑更新了答案和游乐场链接。
猜你喜欢
  • 1970-01-01
  • 2020-06-20
  • 2018-07-30
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多