我的YML参数看起来像

nodes: one, two
instanceMinOne: 1
instanceMaxOne: 2
instanceMinTwo: 4
instanceMaxTwo: 6

有没有办法用Go模板动态读取例如instanceMinOne,其中变量名由instanceMin+来自 node 列表的动态值组成?

例如(这显然不起作用,但只是给出了我想要实现的 idea )

{{ - range $nodeName := (split .Parameters.nodes) } } } }
   instance-min: {{ .Parameters.instanceMin$nodeName }}
   instance-max: {{ .Parameters.instanceMan$nodeName }}
{{ - end }}

推荐答案

要实现你想要的,你必须解决两项任务:

  • 字符串连接
  • 使用动态值编制索引

对于串联,您可以使用内置print函数,例如

{{ $key := print "instanceMin" $nodeName }}

要编制索引,请使用内置的index函数:

instance-min: {{ index $.Parameters $key }}

(注意:{{range}}操作更改点,因此在它内部需要$才能在循环变量外部引用.)

或者用一句话:

instance-min: {{ index $.Parameters (print "instanceMin" $nodeName) }}

查看可运行的演示:

func main() {
    t := template.Must(template.New("").Parse(src))

    params := map[string]any{
        "Parameters": map[string]any{
            "nodes":          []string{"One", "Two"},
            "instanceMinOne": 1,
            "instanceMaxOne": 2,
            "instanceMinTwo": 4,
            "instanceMaxTwo": 6,
        },
    }

    if err := t.Execute(os.Stdout, params); err != nil {
        panic(err)
    }
}

const src = `{{- range $idx, $nodeName := .Parameters.nodes }}
   instance-min: {{ index $.Parameters (print "instanceMin" $nodeName) }}
   instance-max: {{ index $.Parameters (print "instanceMax" $nodeName) }}
{{- end }}`

这将输出(在Go Playground上试用):

instance-min: 1
instance-max: 2
instance-min: 4
instance-max: 6

Go相关问答推荐

Zitadel示例Go Webapp加密密钥

如何修复Go中调用GetRawInputDeviceInfA Windows API函数时的错误?

显示GUI时后台处理功能

Redis:尽管数据存在,但 rdb.Pipelined 中出现redis:nil错误

go测试10m后如何避免超时

Go:为什么我不能比较 net.Addr

Go:如何在不加载正文的情况下创建 http 代理通行证

在 Windows 11 上运行 go mod tidy 时的 gitlab 权限问题

Golang 构建多平台问题

go:embed 文件扩展名模式

使用反射在 struct 内迭代切片 struct

如何 Select 前 N 个元素 Gin-Gorm

将接口方法的参数限制为几个允许的 struct ?

为什么import和ImportSpec之间可以出现多行注释,而PackageName和ImportPath之间不能出现?

在 Go 中将十六进制转换为带符号的 Int

如何从 docker-compose 命令运行 2 个不同的命令:

gob 解码器仅返回数组中的第一个元素

不能使用 *T 类型的变量作为参数类型

并发 map map导致的 Golang 数据竞争

如何访问 Go 模板中数组的第一个索引的值