为了账号安全,请及时绑定邮箱和手机立即绑定

在 Interface{} 中存储配置结构并将其转换回原始结构

在 Interface{} 中存储配置结构并将其转换回原始结构

Go
弑天下 2022-10-10 19:36:54
我尝试做什么我为 s 编写了一个模板App每个App都有一个配置 - 因此我想将 s 存储Config到App struct.我所有的configs 都存储在其中JSON- 因此我想提供一个通用func的加载JSONconst JSON = `{  "Name": "TestConfig"}`注意:我尝试使用和不使用指针来解决我的问题,两者都会导致相同的错误消息 - 两个版本都包含在下面。因此,让我们将 App-Template 视为:type App struct {    config    interface{}    configPtr *interface{} }和一个Configuration:// ConfigurationA is an actual implementation of the Config (Application A)type ConfigurationA struct {    Name string    // ... add more properties here}此外,我实现了一个func加载Configfromfile并将其存储在Appfunc (a *App) GeneralConfigLoader(jsonData string, v interface{}) (err error) {    // load json -> struct    err = json.Unmarshal([]byte(jsonData), &v)    if err != nil {        fmt.Println("error unmarshalling JSON data")        return err    }    a.config = v    a.configPtr = &v    return nil}由于我有一个具有一般负载的应用程序,func因此现在应该可以创建一个简单func的将空接口转换为正确的配置结构。// Config - Config of the Appfunc Config(a *App) *ConfigurationA {    var cfg ConfigurationA = a.config.(ConfigurationA)    return &cfg}// ConfigPtr - Config of the Appfunc ConfigPtr(a *App) *ConfigurationA {    var i interface{} = *a.configPtr    return i.(*ConfigurationA)}如果我将其总结为可执行文件,例如:func main() {    var conf ConfigurationA // the interface used as Configuration    var a = &App{}    a.GeneralConfigLoader(JSON, conf)    //panics: interface conversion: interface {} is map[string]interface {}, not main.ConfigurationA    var cfg = Config(a)    fmt.Println("cfg -> ", cfg)    //panics: interface conversion: interface {} is map[string]interface {}, not *main.ConfigurationA    var cfgPtr = ConfigPtr(a)    fmt.Println("cfgPtr -> ", cfgPtr)}应用程序恐慌(上一节中的评论......)为什么 go 会省略类型信息?或者更好...为什么我不能将配置转换回原来的样子,因为我知道它是什么...?注意如果我不使用这个通用加载器并创建它确实有效的具体实现!问题:我究竟做错了什么?使用 go 是不可能的(怀疑)?
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

将指针传递给 GeneralConfigLoader。解组该指针。删除字段App.configPtr。它没有用,也不符合您的期望。


func (a *App) GeneralConfigLoader(jsonData string, v interface{}) (err error) {

    err = json.Unmarshal([]byte(jsonData), v) // & removed here

    if err != nil {

        fmt.Println("error unmarshalling JSON data")

        return err

    }

    a.config = v

    return nil

}


func Config(a *App) *ConfigurationA {

    return a.config.(*ConfigurationA)

}

像这样加载配置:


var config ConfigurationA

var a = &App{}

a.GeneralConfigLoader(JSON, &config) // & added here


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信