2017-01-21 3 views
2

混乱しているタイトルのため申し訳ありませんが、私はこの問題の言葉に困っています。だから私はこのようなYAML設定ファイルを持っていると言うことができます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 ???? 
} 

にこの設定をマーシャリングするために、いくつかの構造体を持っているので、ここでの問題は、動物の種類(クジラ、等。)、および機能(ミュージシャンなどが...)であるということです事前に決定されていない場合は、別々のモジュールとして追加することができ、それぞれ独自の構成を持つことができます。だから、誰かがこのライブラリを使っていて、自分の動物を追加したいと言っています。私はこの動物が何であるか、それが何の選択肢になるのか、その特徴は何かを知ることはできません。私はまた特徴の構造を知らない。私が知っているのは、typeのプロパティとoptionsのプロパティがあるということだけです。開発者がカスタムの動物や機能を追加できるようにしたいと思います。私のライブラリはちょうどYourAnimal.Create(yourConfig)のようなことをすることができます。

私はgo-yamlライブラリを使用しています。 AnimalConfig構造体に見られるように、最初の考えはoptionsfeaturesをちょうどmap[string]stringにしてから、カスタムモジュールをその構造体に非整列させましたが、例えばmusicianの機能では機能しませんでした。 instrumentsはリストであり、文字列ではありません。ありがとう!

+0

明確にFeatureConfig.Optionsは '' map [string] [] string''です。ここでそのようなタイプを使うのはどうですか? – Altenrion

答えて

0

map[string]interface{}の設定を行い、ライブラリを使用している開発者にinterface{}を必要な構造体にデコードさせることができます。
例:https://play.golang.org/p/RVqKP09KR8

関連する問題