登录
首页 >  Golang >  Go问答

如何在 Helm 函数中返回一个映射对象?

来源:stackoverflow

时间:2024-02-24 08:09:25 489浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《如何在 Helm 函数中返回一个映射对象?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我有一个函数,我想在另一个函数中调用它。我希望它返回地图,但它返回地图的 tostring 表示形式。它函数内部的实际映射,但不是函数外部的映射。

{{- define "app.getsubkey" -}}
  {{- $name := .source }}
  {{- range $key, $value := .keys }}
    {{- if kindis "int" $value }}
      {{- $name = index $name (int $value) }}
    {{- else }}
      {{- $name = index $name $value }}
    {{- end }}
  {{- end }}
  {{- if kindis "string" $name }}
    {{- trim $name }}
  {{- else }}
    {{ $name }}
  {{- end }}
{{- end }}

当我在下面的 yaml 上使用 {{- include "app.getsubkey" (dict "source" .values.vars "keys" (list 0)) }} 调用此函数时,在函数 $name 内是一张地图(我使用 kindof 来检查这一点),但在它之外是一种字符串。我如何才能将其作为地图返回?

vars:
  - name: something
    value: blah

解决方案


准确地说:您的 app.getsubkey 不是一个函数,它是一个 named template,因此,它不会返回任何内容。另一方面,include 是一个函数。它将模板名称及其上下文作为参数,并将渲染的模板作为字符串返回。您无法更改 include 函数返回值的类型。

也就是说,我看到两个选择:

  • 如果您的目标是从 include "app.getsubkey" 调用(仍为字符串)获取格式正确的 yaml,请在命名模板中使用 toyaml 函数,即:
{{- define "app.getsubkey" -}}
  ...
  {{- else }}
    {{- $name | toyaml | nindent 0 }}
  {{- end }}
{{- end }}

nindent 0 是获得正确左对齐 yaml 所必需的

  • 如果您想获取实际的字典(用于进一步处理),则需要将从 include 回调返回的字符串转换回对象(命名模板中的 toyaml 仍然需要):
  {{- $d := dict "source" .Values.vars "keys" (list 0) | include "app.getSubKey" | fromYaml -}}

函数fromyaml没有文档记录,因此使用它可能有点冒险。我在官方文档中找到的唯一痕迹是在 library charts 页面上的示例中。

顺便说一句,app.getsubkey 逻辑似乎不正确:对于包含多个元素的 keys 列表,它将失败。

如果 app.getsubkey 返回一个数组,则必须使用 fromyamlarray 来“解码”数据。

本篇关于《如何在 Helm 函数中返回一个映射对象?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>