【问题标题】:Checking if string from golang file exists in yaml file检查来自golang文件的字符串是否存在于yaml文件中
【发布时间】:2020-02-21 08:50:23
【问题描述】:

我对使用 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 文件中的值进行比较。比如:

  • 如果 p 仅等于 allowed-deps 中的值,则打印“successfully built rpm”并且不提示 os.Exit(1)
  • 如果 p 等于任何第三方部门,则打印“err msg for third-party deps”和 os.Exit(1)
  • 如果 p 等于任何内部依赖,则打印“another err mssg”和 os.Exit(1)

我该怎么做?

【问题讨论】:

    标签: go yaml rpm


    【解决方案1】:

    您可以使用 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")
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多