gpt4 book ai didi

json - 将接口(interface)传递给函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:50 24 4
gpt4 key购买 nike

我正在尝试编写一个采用 json 文件名和配置结构的配置包。它应该将 json 解码到传入的结构中并返回它。 我正在尝试使用接口(interface),以便我可以传递任何我想要的结构

错误是:

panic :接口(interface)转换:interface {} 是 map[string]interface {},不是 *main.ConfigurationData

我不太确定如何解决这个问题。

这是我的主包

package main

import (
"config"
"commons"
)

type ConfigurationData struct {
S3ARN string `json:"S3ARN"`
SQSQueueUrl string `json:"SQSQueueUrl"`
}

var configData *ConfigurationData

func main(){
configData=config.Load("aws.config.json",configData).(*ConfigurationData)
commons.Dump(configData)
}

这是我的配置包

package config

import (
"os"
"encoding/json"
"sync"
"commons"
)

var configLock = new(sync.RWMutex)

func Load(filename string,config interface{})interface{} {
file, err := os.Open(filename)
commons.CheckErrorf(err, "Config Open Error")
defer file.Close()
decoder := json.NewDecoder(file)
configLock.Lock()
err = decoder.Decode(&config)
commons.CheckErrorf(err, "Config Decode Error")
configLock.Unlock()
return config
}

最佳答案

answer很好地解释了为什么会出现异常。

你应该做什么:

encoding/json 包遇到实现了 Marshaler 接口(interface)的类型时,它使用该类型的 MarshalJSON() 方法而不是将对象转换为 JSON 的默认编码代码。类似地,在解码 JSON 对象时,它将测试对象是否实现了 Unmarshaler 接口(interface),如果是,它将使用 UnmarshalJSON() 方法而不是默认的解码行为。

我的解决方案是在 *ConfigurationData 上实现 UnmarshalJSON 方法,方法 Load 应该接受 Unmarshaler接口(interface)而不是 interface{}

您可以在此处阅读有关技术的更多信息:https://blog.gopheracademy.com/advent-2016/advanced-encoding-decoding/

然后你可以简单地在 Load 方法中执行 json.Unmarshal(b, &config) 其中 b[]byte 从文件中读取。

关于json - 将接口(interface)传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51887600/

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