将 YAML 解组为未知结构

Wes*_*ton 5 yaml go

对不起,标题令人困惑,我在措辞这个问题时遇到了麻烦。所以假设我有一个像这样的 YAML 配置文件

animals:
  -
    type: whale
    options:
      color: blue
      name: Mr. Whale
    features:
       -
         type: musician
         options:
           instruments:
             - Guitar
             - Violin
Run Code Online (Sandbox Code Playgroud)

非常人为的例子,但它直接类似于我真正使用的。

所以现在我有一些结构可以将这个配置编组到

type Config struct {
  AnimalConfigs []*AnimalConfig `yaml:"animals"`
}

type AnimalConfig struct{
  Type string
  Options map[string]string // ????
  Features []*FeatureConfig
}

type FeatureConfig struct{
  Type string
  Options ????
}
Run Code Online (Sandbox Code Playgroud)

所以这里的问题是动物类型(鲸鱼等)和特征(音乐家等)不是提前确定的,它们可以作为单独的模块添加,并且每个模块都可以有自己的配置。所以说有人正在使用这个库并想要添加他们自己的动物。我不知道这种动物是什么,它的选择是什么,它的特征是什么。我也不知道该功能的结构。我所知道的是它将有一个type财产,一个options财产。我希望开发人员能够添加自定义动物和功能,而我的库可以执行类似YourAnimal.Create(yourConfig).

我正在使用 go-yaml 库。正如您在 AnimalConfig 结构中看到的那样,我最初的想法是让optionsfeatures只是map[string]string,然后让自定义模块将该字符串解组到他们自己的结构中,但这不适用于该musician功能,因为它instruments是一个列表,不是字符串。谢谢!

小智 -1

您可以进行类型配置map[string]interface{},并让开发人员使用您的库解码interface{}为所需的结构。
示例: https: //play.golang.org/p/RVqKP09KR8