我正在尝试解析这个yaml,我想获取run条目(test1或test2)的值而没有成功,这是我的工作示例。
我有点迷失地图内的地图:(,这是给…
我试过的是这个有效,但如果运行值为空或根本没有条目会发生什么,这将导致转储如何克服这个?
你可以做
runParams, ok := runners.BuildParams.BeforeExec["run-parameters"] if !ok { // handle lack of "run-parameters" in BeforeExec } runParamsMap, ok := runParams.(map[interface{}]interface{}) if !ok { // handle "run-parameters" not being a map } run, ok := runParamsMap["run"] if !ok { // handle lack of "run" inside "run-parameters" } runStr, ok := run.(string) if !ok { // handle "run" not being a string } fmt.Println("run: ", runStr)
这非常冗长所以你可以使用类似的东西 https://github.com/jmoiron/jsonq ,您可以在其中指定嵌套在多个级别的地图中的所需值的“路径”。尽管名称中包含“json”,但此库可以使用map [string] interface {}而不是json文件。但请注意,您用于yaml解组的库会导致 map[interface{}]interface{} 代替 map[string]interface{} 并且你将不得不使用另一个,以便它与jsonq一起使用。
map[interface{}]interface{}
map[string]interface{}
run, err := jsonq.NewQuery(runners.BuildParams.BeforeExec).String("run-parameters", "run") if err != nil { // handle all possible errors in one place } fmt.Println("run: ", run)