如何从我的 yaml 文件访问“map[string]interface {}”数据

我有一个 yaml 文件,我正在尝试读入并循环提取一些数据。


我的 yaml 示例


---

THE/NAME/DOESNT/MATTER:

  TEST_NAME: THIS/IS/WHAT/IS/DISPLAYS/ON/THE/HTML

  RUN_PATH: example/testfiles/release

  SOMETHING_ELSE: [1,2,3]

ANOTHER/PATH/LIKE/STRING:

  TEST_NAME: USED/FOR/THE/HTML

  RUN_PATH: example/testfiles/foo

我的代码


package main

import (

    "fmt"

    "os"

    "io/ioutil"


    "gopkg.in/yaml.v3"

)


func main() {

    reportYAML := os.Args[1]

    // userDictionary := os.Args[2]


    yfile, err := ioutil.ReadFile(reportYAML)

    if err != nil {

        fmt.Printf("ERROR: Unable to open yaml file : %s\n", err)

    }

    data := make(map[interface{}]interface{})

    error := yaml.Unmarshal([]byte(yfile), &data)

    if error != nil {

        fmt.Printf("ERROR: Unable to read yaml file : %s\n", err)

    }

    for _, value := range data {

        fmt.Printf("%T\n", value)

    }

    

}

yaml 将以类似的模式重复,我正在尝试提取 TEST_NAME 和 RUN_PATH。带 %T 的 Printf 给我map[string]interface {}和 %smap[RUN_PATH:example/testfiles/release SOMETHING_ELSE:[%!s(int=1) %!s(int=2) %!s(int=3)] TEST_NAME:THIS/IS/WHAT/IS/DISPLAYS/ON/THE/HTML]


我一直在尝试value["TESTNAME"]、value.(string)["TESTNAME"]和value["TESTNAME"].(string)其他一些变体,但它们都给我错误。


我知道这是一个简单的问题,但我对 GO 的经验很少,无法从以前类似的 stackoverflow 帖子中解决


附加上下文:每个 yaml 顶级键将包含多个键:值对,但我只对 TEST_NAME 和 RUN_PATH 感兴趣


红颜莎娜
浏览 95回答 1
1回答

慕田峪7331174

如果您只关心几个特定的键,只需创建一个数据结构来公开这些值:package mainimport (    "fmt"    "io/ioutil"    "os"    "gopkg.in/yaml.v3")type (    Entry struct {        TestName string `yaml:"TEST_NAME"`        RunPath  string `yaml:"RUN_PATH"`    })func main() {    reportYAML := os.Args[1]    // userDictionary := os.Args[2]    yfile, err := ioutil.ReadFile(reportYAML)    if err != nil {        fmt.Printf("ERROR: Unable to open yaml file : %s\n", err)    }    data := make(map[string]Entry)    error := yaml.Unmarshal([]byte(yfile), &data)    if error != nil {        fmt.Printf("ERROR: Unable to read yaml file : %s\n", err)    }    for _, value := range data {        fmt.Printf("test_name: %s\n", value.TestName)        fmt.Printf("run_path: %s\n", value.RunPath)    }}针对您的示例数据运行上述代码会产生:test_name: THIS/IS/WHAT/IS/DISPLAYS/ON/THE/HTMLrun_path: example/testfiles/releasetest_name: USED/FOR/THE/HTMLrun_path: example/testfiles/foo
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go