为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
红颜莎娜 2023-03-15 13:53:07
我有一个 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 mainimport (    "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 感兴趣
查看完整描述

1 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

如果您只关心几个特定的键,只需创建一个数据结构来公开这些值:


package main


import (

    "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/HTML

run_path: example/testfiles/release

test_name: USED/FOR/THE/HTML

run_path: example/testfiles/foo


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信