Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 将YAML解组为未知结构_Go_Yaml - Fatal编程技术网

Go 将YAML解组为未知结构

Go 将YAML解组为未知结构,go,yaml,Go,Yaml,很抱歉标题混淆,我在措辞上有困难。假设我有这样一个YAML配置文件 animals: - type: whale options: color: blue name: Mr. Whale features: - type: musician options: instruments: - Guitar - Violin

很抱歉标题混淆,我在措辞上有困难。假设我有这样一个YAML配置文件

animals:
  -
    type: whale
    options:
      color: blue
      name: Mr. Whale
    features:
       -
         type: musician
         options:
           instruments:
             - Guitar
             - Violin
非常做作的例子,但它直接类似于我真正使用的

现在我有了一些结构来封送这个配置

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

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

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


我正在使用go yaml图书馆。正如您在AnimalConfig结构中看到的,我最初的想法是让
选项
功能
只是
映射[string]字符串
,然后让自定义模块将该字符串解组到它们自己的结构中,但这在例如
音乐家
功能中不起作用,因为
乐器
是一个列表,而不是字符串。谢谢

您可以将
类型的配置映射到[string]接口{}
,并让使用库的开发人员将
接口{}
解码为所需的结构。

示例:

我认为,一般来说,您要问的是,当您不知道将要生成的结构时,如何解组YAML,是吗?如果是这样,我所做的就是将YAML转换为JSON,然后使用标准的
编码/JSON
来解组。这将为您提供一个包含YAML文档中所有内容的
struct
,但您必须通过它进行“类型切换”,当然,键名可能在一开始就不为人所知


下面是一个示例:

您的FeatureConfig.Options通常是
map[string][]string
。在这里使用这种类型有什么问题?