代码之家  ›  专栏  ›  技术社区  ›  somejkuser

将接口传递到函数

  •  -2
  • somejkuser  · 技术社区  · 8 年前

    我正在尝试编写一个配置包,它包含一个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
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   vardius    8 年前

    这个 answer 很好地解释了为什么你会有例外。

    你应该做什么:

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

    我的解决办法是 方法打开 *ConfigurationData 和方法 Load 应该接受 Unmarshaler 接口而不是 interface{}

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

    那么你就可以了 json.Unmarshal(b, &config) 在里面 装载 方法,其中 []byte 从文件中读取。

        2
  •  0
  •   ctt    8 年前

    documentation on json.Unmarshall 解组到接口值将解组到预定义类型列表之一的新结构:

    要将JSON解组为接口值,解组存储一个

    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{} . 在您的函数中,指向该新解封结构的指针存储在config参数中并返回。当返回的值的类型不是您断言的类型时,将发生异常。