gpt4 book ai didi

go - 加载具有不同结构项列表的YAML文件

转载 作者:行者123 更新时间:2023-12-01 22:20:25 24 4
gpt4 key购买 nike

我有一个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 Actions

func 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键将其强制转换为正确的结构。有没有办法使这项工作?
谢谢!

最佳答案

最后,我采用了这种方法:

    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

关于go - 加载具有不同结构项列表的YAML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63924839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com