我有一個具有動態模式的YAML結構,例如我可以有以下yaml:具有動態模式的Golang和yaml
array:
- name: myvar
val: 1
- name: mymap
val: [ 1, 2]
Goyaml將yaml映射到Go結構,它應該聲明明確的類型。在這裏,val
是一個數字,或者一個數組,甚至是一個地圖。
這是最適合這種情況的解決方案嗎?
我有一個具有動態模式的YAML結構,例如我可以有以下yaml:具有動態模式的Golang和yaml
array:
- name: myvar
val: 1
- name: mymap
val: [ 1, 2]
Goyaml將yaml映射到Go結構,它應該聲明明確的類型。在這裏,val
是一個數字,或者一個數組,甚至是一個地圖。
這是最適合這種情況的解決方案嗎?
我決定添加一個顯示類型斷言的答案,而不是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])
}
}
}
爲了讓你的答案完美,你可以添加如何將'interface'類型'Val'轉換爲'int','[] int','[] string'等類型的變量? – TehSphinX
它們**在轉換語句中被轉換。在他們各自的情況下'val'實際上是正確的類型。 – RayfenWindspear
謝謝!我沒有意識到這一點。我的+1 – TehSphinX
您是否嘗試'interface {}'作爲'val'的類型? – TehSphinX
具體而言,您可以使用'interface {}'作爲類型,然後使用類型切換(https://tour.golang.org/methods/16)來使用它。 – RayfenWindspear
@RayfenWindspear,TehSphinX謝謝,這種方法沒有任何缺點嗎? –