首页 > 后端开发 > Golang > 正文

如何使用 Go 模板与 Switch 和 ForEach 来生成具有依赖类型特定命令的 Bash 脚本?

DDD
发布: 2024-10-29 09:50:02
原创
308 人浏览过

How to Use Go Template with Switch and ForEach to Generate Bash Scripts with Dependency Type Specific Commands?

带有 Switch 和 ForEach 的 Golang 模板

背景:

任务是生成一个来自 Go 程序的 bash.sh 文件,包含 switchForEach 结构。生成的脚本应该迭代依赖项列表,访问它们的类型并使用这些类型来打印特定消息。

问题:

使用 YAML 编组和的初步尝试模板解析导致功能不正确。出现此问题的原因是模板中未正确使用依赖项类型。

解决方案:

为了解决该问题,依赖项结构已修改为包含 Install 字段表示要为每种类型执行的命令。然后创建一个模板来迭代 Dependency 数组,并使用 rangeswitch 构造根据类型打印命令。

以下代码片段说明了修改后的方法:

<code class="go">import (
    "log"
    "text/template"
    "gopkg.in/yaml.v2"
    "os"
)

type File struct {
    TypeVersion string `yaml:"_type-version"`
    Dependency  []Dependency
}

type Dependency struct {
    Name    string
    Type    string
    CWD     string
    Install map[string]string
}

var data = `
_type-version: "1.0.0"
dependency:
  - name: ui
    type: runner
    cwd: /ui
    install:
       api: echo api1

  - name: ui2
    type: runner2
    cwd: /ui2
    install:
       api: echo api2

`

func main() {
    f := File{}

    err := yaml.Unmarshal([]byte(data), &amp;f)
    if err != nil {
        log.Fatalf("error: %v", err)
    }

   const t = `
#!/bin/bash

{{range .Dependency}}
echo "type is {{.Type}}"
echo "cwd is {{.CWD}}"
{{range $installName, $installCmd := .Install}}
echo "install {{$installName}} ({{$installCmd}})"
{{end}}
{{end}}
`

    tt := template.Must(template.New("").Parse(t))
    err = tt.Execute(os.Stdout, f)
    if err != nil {
        log.Println("executing template:", err)
    }
}</code>
登录后复制

输出:

更新的代码生成预期的脚本:

<code class="sh">#!/bin/bash

echo "type is runner"
echo "cwd is /ui"
echo "install api (echo api1)"
echo "type is runner2"
echo "cwd is /ui2"
echo "install api (echo api2)"</code>
登录后复制

总结,解决方案涉及正确使用模板访问依赖项数据,并使用 switchForEach.

根据类型生成适当的命令

以上是如何使用 Go 模板与 Switch 和 ForEach 来生成具有依赖类型特定命令的 Bash 脚本?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板