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

将接口传递给函数

将接口传递给函数

Go
慕雪6442864 2023-03-21 15:35:11
我正在尝试编写一个采用 json 文件名和配置结构的配置包。它应该将 json 解组到传入的结构中并返回它。我正在尝试使用接口,以便我可以传递任何我想要的结构错误是:panic: interface conversion: interface {} is map[string]interface {}, not *main.ConfigurationData我不太确定如何解决这个问题。这是我的主要包裹package mainimport (    "config"    "commons")type ConfigurationData struct {    S3ARN string `json:"S3ARN"`    SQSQueueUrl string `json:"SQSQueueUrl"`}var configData *ConfigurationDatafunc main(){    configData=config.Load("aws.config.json",configData).(*ConfigurationData)    commons.Dump(configData)}这是我的配置包package configimport (    "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}
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

这个答案很好地解释了为什么你会得到例外。

你应该做什么:

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

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

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

然后你会在从文件中读取b 的方法json.Unmarshal(b, &config)中做简单的事情。Load[]byte


查看完整回答
反对 回复 2023-03-21
?
精慕HU

TA贡献1845条经验 获得超8个赞

根据json.Unmarshall 上的文档,解组为接口值将解组为预定义类型列表之一的新结构:

为了将 JSON 解组为接口值,Unmarshal 将其中一个存储在接口值中:

bool, for JSON booleans 

float64, for JSON numbers

string, for JSON

strings []interface{}, for JSON arrays 

map[string]interface{}, for JSON objects

nil for JSON null

在您的例子中,选择的类型是map[string]interface{}. 在您的函数中,指向新解组结构的指针存储在配置参数中并返回。发生恐慌是因为返回值的类型不是您声明的类型。


查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

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