1. 字典函数
Helm 提供了一个key/value存储类型称为dict("dictionary"的简称,Python中也有)。dict是无序类型。
字典的key 必须是字符串。但值可以是任意类型,甚至是另一个dict 或 list。
不像list, dict不是不可变的。set和unset函数会修改字典的内容。
Helm 提供了以下函数支持使用字典: deepCopy(mustDeepCopy), dict, get, hasKey, keys, merge (mustMerge), mergeOverwrite (mustMergeOverwrite), omit, pick, pluck, set, unset,和 values。
1.1. dict
通过调用 dict 函数并传递一个键值对列表创建字典。
下面是创建三个键值对的字典:
$myDict := dict "name1" "value1" "name2" "value2" "name3" "value 3"
1.2. get
给定一个映射和一个键,从映射中获取值。
get $myDict "name1"
上述结果为: "value1"
注意如果没有找到,会简单返回""。不会生成error。
1.3. set
使用set给字典添加一个键值对。
$_ := set $myDict "name4" "value4"
注意set 返回字典 (Go模板函数的一个要求),因此你可能需要像上面那样使用使用$_赋值来获取值。
1.4. unset
给定一个映射和key,从映射中删除这个key。
$_ := unset $myDict "name4"
和set一样,需要返回字典。
注意,如果key没有找到,这个操作会简单返回,不会生成错误。
1.5. hasKey
hasKey函数会在给定字典中包含了给定key时返回true。
hasKey $myDict "name1"
如果key没找到,会返回false。
1.6. pluck
pluck 函数给定一个键和多个映射,并获得所有匹配项的列表:
pluck "name1" $myDict $myOtherDict
上述会返回的list包含了每个找到的值([value1 otherValue1])。
如果key在映射中 没有找到 ,列表中的映射就不会有内容(并且返回列表的长度也会小于调用pluck的字典)。
如果key是 存在的, 但是值是空值,会插入一个值。
Helm模板中的一个常见用法是使用 pluck... | first
从字典集合中获取第一个匹配的键。
1.7. merge, mustMerge
将两个或多个字典合并为一个, 目标字典优先:
$newdict := merge $dest $source1 $source2
这是个深度合并操作,但不是深度拷贝操作。合并的嵌套对象是两个字典上的同一实例。如果想深度合并的同时进行深度拷贝, 合并的时候同时使用deepCopy函数,比如:
deepCopy $source | merge $dest
mustMerge 会返回错误,以防出现不成功的合并。
1.8. mergeOverwrite, mustMergeOverwrite
合并两个或多个字典,优先按照 从右到左,在目标字典中有效地覆盖值:
给定的:
dst:
default: default
overwrite: me
key: true
src:
overwrite: overwritten
key: false
会生成:
newdict:
default: default
overwrite: overwritten
key: false
$newdict := mergeOverwrite $dest $source1 $source2
这是一个深度合并操作但不是深度拷贝操作。两个字典上嵌入的对象被合并到了同一个实例中。如果你想在合并的同时进行深度拷贝, 使用deepCopy函数,比如:
deepCopy $source | mergeOverwrite $dest
mustMergeOverwrite 会返回错误,以防出现不成功的合并。
1.9. keys
keys函数会返回一个或多个dict类型中所有的key的list。由于字典是 无序的,key不会有可预料的顺序。 可以使用sortAlpha存储。
keys $myDict | sortAlpha
当提供了多个词典时,key会被串联起来。使用uniq函数和sortAlpha获取一个唯一有序的键列表。
keys $myDict $myOtherDict | uniq | sortAlpha
1.10. pick
pick函数只从字典中选择给定的键,并创建一个新的dict。
$new := pick $myDict "name1" "name2"
上述结果为: {name1: value1, name2: value2}
1.11. omit
omit函数类似于pick,除它之外返回一个新的dict,所有的key 不 匹配给定的key。
$new := omit $myDict "name1" "name3"
上述结果为: {name2: value2}
1.12. values
values函数类似于keys,返回一个新的list包含源字典中所有的value(只支持一个字典)。
$vals := values $myDict
上述结果为: list["value1", "value2", "value 3"]。注意 values不能保证结果的顺序;如果你需要顺序, 请使用sortAlpha。
1.13. deepCopy, mustDeepCopy
deepCopy 和 mustDeepCopy 函数给定一个值并深度拷贝这个值。包括字典和其他结构体。 deepCopy有问题时会出错, 而mustDeepCopy会返回一个错误给模板系统。
dict "a" 1 "b" 2 | deepCopy
2. 字典的内部说明
dict 在Go里是作为map[string]interface{}执行的。Go开发者可以传map[string]interface{}值给上下文, 将其作为 dict 提供给模板。