gpt4 book ai didi

templates - 带有开关和 ForEach 的 Golang 模板

转载 作者:IT王子 更新时间:2023-10-29 01:09:34 25 4
gpt4 key购买 nike

我需要从 golang 程序创建 bash.sh 文件应该执行以下操作:

在依赖项上创建ForEach 循环并读取类型和根据类型打印不同的回显消息(命令)我需要它与 switch 一起工作关于 Golang 依赖的 type

例如类似下面的东西

为每个依赖项添加回显的类型消息

#!/bin/bash
for a in $(dependencies.type)
echo $runner //from type
done

我所做的是以下不起作用

  1. 对于依赖类型“runner1”(参见依赖结构实例中的类型属性值)我需要运行几个命令“runner2”的想法" 我需要运行几个不同的命令
  2. 上面的那些命令(比如 echo api1 for runner1 等)应该写在我需要从模板创建的 bash.script 中

主要包

import (
"fmt"
"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 []Install
}

type Install map[string]string

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

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

`

func main() {
f := File{}

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

d, err := yaml.Marshal(&f)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- t dump:\n%s\n\n", string(d))

wd, _ := os.Getwd()

newfile, err := os.Create(wd + "/" + "bash.sh") // Truncates if file already exists
if err != nil {
fmt.Errorf("Failed to create file: %s , %s", wd+"/"+"bash.sh", err)
}

fmt.Println(newfile)

const File = `
#!/bin/bash
{{.dependency}},
{{if .Type runner2}}
echo "type is runner2"
{{- else}}
echo "type is %S"
{{- end}}
{{end}}
`

t := template.Must(template.New("bash.sh").Parse(File))

for _, r := range f.Dependency {
err := t.Execute(os.Stdout, r)
if err != nil {
log.Println("executing template:", err)
}
}

}

更新

例如

假设我的映射如下所示,依赖结构应该与 API 结构一起工作,以了解为每个类型值运行哪个命令

API := map[string]string {
{
“runner1” : “api1”,
},
{
“runner2” : “api2”,
}
}

脚本最后应该是这样的

#bin/bash

// in context of dep1
echo runner1
submitting api1


// in context of dep2
echo runner2
submitting api2

最佳答案

这里有一些为上述内容工作的最小更改:

package main

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 []Install
}

type Install map[string]string

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

- name: ui2
type: runner2
cwd: /ui2
install:
- name: 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 .Install}}
echo "install {{.name}}"
{{end}}
{{end}}
`

tt := template.Must(template.New("").Parse(t))
err = tt.Execute(os.Stdout, f)
if err != nil {
log.Println("executing template:", err)
}
}

这产生

$ go run main.go 

#!/bin/bash


echo "type is runner"
echo "cwd is /ui"

echo "install api"


echo "type is runner2"
echo "cwd is /ui2"

echo "install api2"

关键的变化是让模板完成工作——在 Dependency 数组上使用 range 函数,然后在 Install 数组上再次使用,以遍历数据结构。

另一个变化是只写入标准输出,而不是文件。如果需要将其转换为脚本,只需将其通过管道传输到文件即可。

更广泛地说,我认为围绕安装步骤所有权的数据模型存在紧张关系。每种流道类型的安装步骤是否固定?或者它们可能会有所不同?如果它们是固定的,那么将 runner 类型的 map[string][string] 映射到安装步骤数组可能是有意义的,这将减轻具有安装步骤副本的 Dependency 对象。

我也想知道 YAML - 它是真实的来源吗?还是衍生品?如果是导数,或许就没有必要了。让 go 程序询问真实的真实来源并生成脚本可能更好。

无论如何,我希望这对您有所帮助。

关于templates - 带有开关和 ForEach 的 Golang 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46511312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com