检查 yaml 文件中是否存在来自 golang 文件的字符串

Checking if string from golang file exists in yaml file

我对使用 yaml 和 golang 还比较陌生。目前,我正在创建一个解析 rpm 包以检查子系统依赖性的 golang 程序。它扩展了 go-rpmutils library

到目前为止,这是我在主函数中处理条件的代码:

func main() {
    // Parse the rpm
    rpm, err := rpmutils.ReadRpm("file.rpm")
    if err != nil {
        panic(err)
    }

    // Get RPM Deps
    dependencies, err := rpm.Header.GetStrings(rpmutils.REQUIRENAME)
    if err != nil {
        panic(err)
    }

    // Check for specific dep condition
    for _, p := range dependencies {
        if strings.HasPrefix(p, "prefix1") && p != "string-including-prefix1" {
            fmt.Printf("\t%s\n", p)
            defer os.Exit(1)
        }
    }
}

我能够输出依赖关系,但想为特定子系统依赖关系存在时设置几个 if else 条件。

在一个单独的 yaml 文件中,我有:

allowed-deps:
    -dep1
    -dep2
    -dep3

third-party-deps:
    -dep4
    -dep5
    -dep6

internal-deps:
    -dep7
    -dep8
    -dep9

我想将 for 循环中的 var p 的值与 yaml 文件中的值进行比较。例如:

我该怎么做?

您可以使用 YAML 包(如 https://github.com/go-yaml/yaml),将您的文件加载到一个变量中,并在您建议的 ifs 中的每一步检查它。我会使用地图,因为您似乎会非常频繁地检查集合。

这里有一个我使用该包制作的简单示例,因此您可以了解如何解组文件、转换为地图并检查地图:https://play.golang.org/p/t1GhUPvAQNQ

package main

import (
    "fmt"
     "github.com/go-yaml/yaml"
)

const str = `
allowed-deps:
    - dep1
    - dep2
    - dep3

third-party-deps:
    - dep4
    - dep5
    - dep6

internal-deps:
    - dep7
    - dep8
    - dep9
`

type MyYAML struct {
    AllowedDeps    []string `yaml:"allowed-deps"`
    ThirdPartyDeps []string `yaml:"third-party-deps"`
    InternalDeps   []string `yaml:"internal-deps"`
}

func main() {
    var a MyYAML
    err := yaml.Unmarshal([]byte(str), &a)
    if err != nil {
        panic(err)
    }

    // Build a map for every section.
    allowedDeps    := map[string]struct{}{}
    thirdPartyDeps := map[string]struct{}{}
    internalDeps   := map[string]struct{}{}

    for _, dep := range a.AllowedDeps {
        allowedDeps[dep] = struct{}{}
    }
    for _, dep := range a.ThirdPartyDeps {
        thirdPartyDeps[dep] = struct{}{}
    }
    for _, dep := range a.InternalDeps {
        internalDeps[dep] = struct{}{}
    }

    // Some checking examples.
    if _, ok := allowedDeps["dep1"]; ok {
        fmt.Println("dep1 found")
    }
    if _, ok := thirdPartyDeps["dep1"]; ok {
        fmt.Println("dep1 found")
    }
    if _, ok := internalDeps["dep8"]; ok {
        fmt.Println("dep8 found")
    }

}