gpt4 book ai didi

json - Go中根据字符串动态创建某种类型的变量

转载 作者:IT王子 更新时间:2023-10-29 01:18:09 27 4
gpt4 key购买 nike

简单版
如何根据字符串的值创建特定类型的变量?

type ta struct { a int }
type tb struct { b float }
type tc struct { c string }

t := "tb"
v := MagicVarFunc(t) // Returns a new allocated var of type interface{}
v.(tb).b = 8.3

真实例子
令人惊讶的是,在下面的工作示例中,我正在基于 string 动态创建变量。这是通过在 map 中注册每个结构类型来完成的,其中 string 是键,type 的 nil 指针是值。
每个类型 都使用方法 New() 实现一个接口(interface),该方法返回该特定类型的新变量。

下面的示例非常接近我想要做的,其中每个操作都有一组 JSON 编码数据,这些数据将填充相应的结构。我构建它的方式也是因为我希望能够创建我注册到 map 的新的独立操作。

我不确定我现在是不是在滥用语言。
如果我完全不在意,有人可以给我任何指示吗?有明显更简单的方法吗?

package main

import (
"fmt"
"encoding/json"
)

// All I require of an action is that it may be executed
type ActionHandler interface {
Exec()
New() ActionHandler
}

// My list of actions
var mActions = make(map[string]ActionHandler)

// Action Exit (leaving the program)
type aExit struct {}
func (s *aExit) Exec() { fmt.Println("Good bye") }
func (s *aExit) New() ActionHandler { return new(aExit) }
func init() {
var a *aExit
mActions[`exit`] = a
}

// Action Say (say a message to someone)
type aSay struct {
To string
Msg string
}
func (s *aSay) Exec() { fmt.Println(`You say, "` + s.Msg + `" to ` + s.To) }
func (s *aSay) New() ActionHandler { return new(aSay) }
func init() {
var a *aSay
mActions[`say`] = a
}

func inHandler(action string, data []byte) {
a := mActions[action].New()
json.Unmarshal(data, &a)
a.Exec()
}

func main(){
inHandler(`say`, []byte(`{"to":"Sonia","msg":"Please help me!"}`))
inHandler(`exit`, []byte(`{}`))
}

最佳答案

如果可以获取 Type,则可以使用反射获取类型的零值,或者使用反射分配类型的新值(如 new)运行时的值。但是,我认为没有办法从字符串中获取 Type。您需要具有该类型的值才能获取类型本身。

我采纳了你的想法,使用 map 。我将字符串映射到类型本身,您可以使用 reflect.TypeOf 获取类型,它从接口(interface)值中获取类型。然后我使用 reflect.Zero 获取该类型的零值(每个类型都存在的方便值)。然后我把值作为接口(interface)取出来。

package main
import "reflect"

type ta struct { a int }
type tb struct { b float64 }
type tc struct { c string }

var mActions map[string]reflect.Type = make(map[string]reflect.Type)
func init() {
var a ta
mActions[`ta`] = reflect.TypeOf(a)
var b tb
mActions[`tb`] = reflect.TypeOf(b)
var c ta
mActions[`tc`] = reflect.TypeOf(c)
}

func MagicVarFunc(action string) interface{} {
return reflect.Zero(mActions[action]).Interface()
}

func main() {
t := "tb"
v := MagicVarFunc(t) // Returns a new allocated var of type interface{}
x := v.(tb)
x.b = 8.3
}

关于json - Go中根据字符串动态创建某种类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127723/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com