将接口传递给函数

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


错误是:


panic: interface conversion: interface {} is map[string]interface {}, not *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

}


慕雪6442864
浏览 89回答 2
2回答

弑天下

这个答案很好地解释了为什么你会得到例外。你应该做什么:当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

精慕HU

根据json.Unmarshall 上的文档,解组为接口值将解组为预定义类型列表之一的新结构:为了将 JSON 解组为接口值,Unmarshal 将其中一个存储在接口值中:bool, for JSON booleans float64, for JSON numbersstring, for JSONstrings []interface{}, for JSON arrays map[string]interface{}, for JSON objectsnil for JSON null在您的例子中,选择的类型是map[string]interface{}. 在您的函数中,指向新解组结构的指针存储在配置参数中并返回。发生恐慌是因为返回值的类型不是您声明的类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go