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

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

加載包含不同結構項目列表的 YAML 文件

加載包含不同結構項目列表的 YAML 文件

Go
呼如林 2022-06-27 17:18:52
我有一個格式如下的 YAML:actions:  - type: one    onekey: value  - type: two    twokey: value    foo: bar我想將它加載到 Go 結構中。我嘗試使用mapstructurs它,DecodeHook但我無法讓它工作。這是我嘗試過的:type Actions struct {    actions []Action}type Action interface {}type One struct {    Onekey string}type Two struct {    Twokey string    Foo    string}var actions Actionsfunc Load() {...    config := &mapstructure.DecoderConfig{        DecodeHook: func(sourceType, destType reflect.Type, raw interface{}) (interface{}, error) {            if fmt.Sprintf("%s", destType) == "Action" {                var result Action                switch raw.(map[string]interface{})["type"] {                case "one":                    result = One{}                case "two":                    result = Two{}                }                mapstructure.Decode(raw, &result)                return result, nil            }            return raw, nil        },        Result: &actions,    }...}這很丑陋,也不起作用。我得到:panic: interface conversion: interface {} is map[interface {}]interface {}, not map[string]interface {}首先有:if fmt.Sprintf("%s", destType) == "Action"這是可怕的,但我讓這部分工作的唯一方法。然后是讀取列表項并通過鍵將其轉換為正確的結構type。有沒有辦法使這項工作?
查看完整描述

2 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

看看 viper 包:https ://github.com/spf13/viper 它可以讓你從 toml、json yaml 等文件中讀取,然后你可以將每個配置值傳遞給你的結構。



查看完整回答
反對 回復 2022-06-27
?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

最后我采用了這種方法:


    config := &mapstructure.DecoderConfig{

        DecodeHook: func(sourceType, destType reflect.Type, raw interface{}) (interface{}, error) {

            var result Action

            if fmt.Sprintf("%s", destType) == "Action" {

                rawMap := raw.(map[interface{}]interface{})

                switch rawMap["type"] {

                case "one":

                    result = One{}

                case "two":

                    result = Two{}

                }


                mapstructure.Decode(raw, &result)

                return result, nil

            }

            return raw, nil

        },

        Result: &actions,

    }

我只是從 Go 開始,所以可能有更好的方法,但這有點解決了我遇到的兩個問題。


更正:我不得不恢復if fmt.Sprintf("%s", destType) == "Action"到reflect.TypeOf(result) == nil


查看完整回答
反對 回復 2022-06-27
  • 2 回答
  • 0 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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