英文:
golang how can I use struct name as map key
问题
你可以使用反射(reflection)来构建这个映射(map)。以下是一个示例代码:
package main
import (
"fmt"
"reflect"
)
type A struct {
a1 int
a2 string
}
type B struct {
b1 int
b2 string
}
type C struct {
c1 int
c2 string
}
func processA(arg interface{}) {
fmt.Println("Processing A:", arg.(A))
}
func processB(arg interface{}) {
fmt.Println("Processing B:", arg.(B))
}
func processC(arg interface{}) {
fmt.Println("Processing C:", arg.(C))
}
func main() {
funcMap := make(map[reflect.Type]func(interface{}))
funcMap[reflect.TypeOf(A{})] = processA
funcMap[reflect.TypeOf(B{})] = processB
funcMap[reflect.TypeOf(C{})] = processC
arg := A{a1: 1, a2: "Hello"}
for k, v := range funcMap {
if k == reflect.TypeOf(arg) {
v(arg)
}
}
}
在这个示例中,我们首先定义了结构体A、B和C,然后定义了对应的处理函数processA、processB和processC。接下来,我们创建了一个空的映射funcMap,键的类型为reflect.Type,值的类型为func(interface{})。然后,我们将结构体类型和对应的处理函数添加到映射中。最后,我们定义了一个输入参数arg,并使用反射来判断arg的类型,并根据类型在映射中找到对应的处理函数进行处理。
希望这可以帮助到你!如果有任何其他问题,请随时问我。
英文:
type A struct {
a1 int
a2 string
}
type B struct {
b1 int
b2 string
}
type C struct {
c1 int
c2 string
}
there are 3 structs, I want put the names into a map as key, and process func as map value
(instead of type-switch)
input arg is a interface, use for loop to judge what struct this interface is. And process this arg by process func in map value.
about:
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)
}
}
}
how can I build this map??? hope code, thanks! (^o^)
答案1
得分: 3
你想要在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
英文:
You want to index your map on reflect.Type
:
type funcMapType map[reflect.Type]func(interface{})
var funcMap funcMapType
then to register a type with a function:
funcMap[reflect.TypeOf(A{})] = func(v interface{}) { log.Println("found A") }
if your function needs to modify the struct, you'll need to register a pointer to the struct type:
funcMap[reflect.TypeOf(&A{})] = func(v interface{}) { log.Println("found *A") }
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论