2017-08-07 50 views
1

我有一個具有動態模式的YAML結構,例如我可以有以下yaml:具有動態模式的Golang和yaml

array: 
    - name: myvar 
    val: 1 
    - name: mymap 
    val: [ 1, 2] 

Goyaml將yaml映射到Go結構,它應該聲明明確的類型。在這裏,val是一個數字,或者一個數組,甚至是一個地圖。

這是最適合這種情況的解決方案嗎?

+2

您是否嘗試'interface {}'作爲'val'的類型? – TehSphinX

+1

具體而言,您可以使用'interface {}'作爲類型,然後使用類型切換(https://tour.golang.org/methods/16)來使用它。 – RayfenWindspear

+0

@RayfenWindspear,TehSphinX謝謝,這種方法沒有任何缺點嗎? –

回答

3

我決定添加一個顯示類型斷言的答案,而不是reflect包。您可以決定哪個最適合您的應用程序。我個人比較喜歡reflect包的複雜內置函數。

var data = ` 
array: 
    - name: myvar 
    val: 1 
    - name: mymap 
    val: [1, 2] 
` 

type Data struct { 
    Array []struct { 
     Name string 
     Val interface{} 
    } 
} 

func main() { 
    d := Data{} 
    err := yaml.Unmarshal([]byte(data), &d) 
    if err != nil { 
     log.Fatal(err) 
    } 

    for i := range d.Array { 
     switch val := d.Array[i].(type) { 
     case int: 
      fmt.Println(val) // is integer 
     case []int: 
      fmt.Println(val) // is []int 
     case []string: 
      fmt.Println(val) // is []string 
      // .... you get the idea 
     default: 
      log.Fatalf("Type unaccounted for: %+v\n", d.Array[i]) 
     } 
    } 

} 
+0

爲了讓你的答案完美,你可以添加如何將'interface'類型'Val'轉換爲'int','[] int','[] string'等類型的變量? – TehSphinX

+0

它們**在轉換語句中被轉換。在他們各自的情況下'val'實際上是正確的類型。 – RayfenWindspear

+0

謝謝!我沒有意識到這一點。我的+1 – TehSphinX