亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將接口傳遞給函數

將接口傳遞給函數

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 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號