带有 Switch 和 ForEach 的 Golang 模板
背景:
任务是生成一个来自 Go 程序的 bash.sh 文件,包含 switch 和 ForEach 结构。生成的脚本应该迭代依赖项列表,访问它们的类型并使用这些类型来打印特定消息。
问题:
使用 YAML 编组和的初步尝试模板解析导致功能不正确。出现此问题的原因是模板中未正确使用依赖项类型。
解决方案:
为了解决该问题,依赖项结构已修改为包含 Install 字段表示要为每种类型执行的命令。然后创建一个模板来迭代 Dependency 数组,并使用 range 和 switch 构造根据类型打印命令。
以下代码片段说明了修改后的方法:
<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), &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>
总结,解决方案涉及正确使用模板访问依赖项数据,并使用 switch 和 ForEach.
根据类型生成适当的命令以上是如何使用 Go 模板与 Switch 和 ForEach 来生成具有依赖类型特定命令的 Bash 脚本?的详细内容。更多信息请关注PHP中文网其他相关文章!