Sprig:Go 的模板函数
type
status
date
slug
summary
tags
category
icon
password
网址
简介
Sprig 库为 Go 的模板语言提供了超过 70 个模板函数。
- 字符串函数:
trim
,wrap
,randAlpha
,plural
等 - 字符串切片函数:
splitList
,sortAlpha
等
- 整数数学函数:
add
,max
,mul
等 - 整数切片函数:
until
,untilStep
- 浮点数数学函数:
addf
,maxf
,mulf
等
- 日期函数:
now
,date
等
- 默认值函数:
default
,empty
,coalesce
,fromJson
,toJson
,toPrettyJson
,toRawJson
,ternary
- 编码函数:
b64enc
,b64dec
等
- 列表和列表函数:
list
,first
,uniq
等
- 字典和字典函数:
get
,set
,dict
,hasKey
,pluck
,dig
,deepCopy
等
- 类型转换函数:
atoi
,int64
,toString
等
- 路径和文件路径函数:
base
,dir
,ext
,clean
,isAbs
,osBase
,osDir
,osExt
,osClean
,osIsAbs
- 流程控制函数:
fail
- 高级函数
- UUID 函数:
uuidv4
- 操作系统函数:
env
,expandenv
- 版本比较函数:
semver
,semverCompare
- 反射:
typeOf
,kindIs
,typeIsLike
等 - 加密和安全函数:
derivePassword
,sha256sum
,genPrivateKey
等 - 网络:
getHostByName
- URL:
urlParse
,urlJoin
字符串函数
Sprig 提供了许多字符串操作函数。
trim
trim
函数移除字符串两侧的空格:上面的代码产生
hello
trimAll
从字符串的前面或后面移除给定的字符:
上面的代码返回
5.00
(作为字符串)。trimSuffix
仅从字符串中移除后缀:
上面的代码返回
hello
trimPrefix
仅从字符串中移除前缀:
上面的代码返回
hello
upper
将整个字符串转换为大写:
上面的代码返回
HELLO
lower
将整个字符串转换为小写:
上面的代码返回
hello
title
转换为标题格式:
上面的代码返回
Hello World
untitle
移除标题格式。
untitle "Hello World"
产生 hello world
。repeat
重复字符串多次:
上面的代码返回
hellohellohello
substr
从字符串中获取子字符串。它接受三个参数:
- start (int) - 开始位置
- end (int) - 结束位置
- string (string) - 源字符串
上面的代码返回
hello
nospace
移除字符串中的所有空白字符。
上面的代码返回
helloworld
trunc
截断字符串(不添加后缀)
上面的代码产生
hello
。上面的代码产生
world
。abbrev
用省略号(
...
)截断字符串参数:
- max length - 最大长度
- the string - 字符串
上面的代码返回
he...
,因为它将省略号的宽度计入最大长度。abbrevboth
缩写两端:
上面的代码产生
...5678...
它接受:
- left offset - 左侧偏移
- max length - 最大长度
- the string - 字符串
initials
给定多个单词,取每个单词的第一个字母并组合。
上面的代码返回
FT
randAlphaNum, randAlpha, randNumeric, 和 randAscii
这四个函数生成加密安全的(使用
crypto/rand
)随机字符串,但使用不同的基础字符集:randAlphaNum
使用0-9a-zA-Z
randAlpha
使用a-zA-Z
randNumeric
使用0-9
randAscii
使用所有可打印的 ASCII 字符
每个函数都接受一个参数:字符串的整数长度。
上面的代码将产生一个包含三个数字的随机字符串。
wrap
在给定的列数处换行文本:
上面的代码将在 80 列处换行
$someText
中的字符串。wrapWith
wrapWith
的工作方式与 wrap
相同,但允许您指定换行字符串。
(wrap
使用 \\n
)上面的代码产生
hello world
(其中空白字符是 ASCII 制表符)contains
测试一个字符串是否包含在另一个字符串中:
上面的代码返回
true
,因为 catch
包含 cat
。hasPrefix 和 hasSuffix
hasPrefix
和 hasSuffix
函数测试字符串是否具有给定的前缀或后缀:上面的代码返回
true
,因为 catch
具有前缀 cat
。quote 和 squote
这些函数用双引号(
quote
)或单引号(squote
)包装字符串。cat
cat
函数将多个字符串连接成一个,用空格分隔:上面的代码产生
hello beautiful world
indent
indent
函数将给定字符串中的每一行缩进到指定的缩进宽度。这在对齐多行字符串时很有用:上面的代码将每行文本缩进 4 个空格字符。
nindent
nindent
函数与 indent 函数相同,但在字符串开头添加换行符。上面的代码将每行文本缩进 4 个空格字符,并在开头添加换行符。
replace
执行简单的字符串替换。
它接受三个参数:
- string to replace - 要替换的字符串
- string to replace with - 替换为的字符串
- source string - 源字符串
上面的代码将产生
I-Am-Henry-VIII
plural
将字符串复数化。
在上面,如果字符串的长度为 1,将打印第一个参数(
one anchovy
)。否则,将打印第二个参数(many anchovies
)。参数是:
- singular string - 单数字符串
- plural string - 复数字符串
- length integer - 长度整数
注意:Sprig 目前不支持具有更复杂复数化规则的语言。
0
被认为是复数,因为英语语言将其视为复数(zero anchovies
)。Sprig 开发人员正在为更好的国际化制定解决方案。snakecase
将字符串从 camelCase 转换为 snake_case。
上面的代码将产生
first_name
。camelcase
将字符串从 snake_case 转换为 CamelCase
上面的代码将产生
HttpServer
。kebabcase
将字符串从 camelCase 转换为 kebab-case。
上面的代码将产生
first-name
。swapcase
使用基于单词的算法交换字符串的大小写。
转换算法:
- 大写字符转换为小写
- 标题格式字符转换为小写
- 空格后或开头的 lowercase 字符转换为标题格式
- 其他小写字符转换为大写
- 空格由 unicode.IsSpace(char) 定义
上面的代码将产生
tHIS iS a.tEST
。shuffle
打乱字符串。
上面的代码将随机化
hello
中的字母,可能产生 oelhl
。regexMatch, mustRegexMatch
如果输入字符串包含正则表达式的任何匹配项,则返回 true。
上面的代码产生
true
如果出现问题,
regexMatch
会 panic,而 mustRegexMatch
会向模板引擎返回错误。regexFindAll, mustRegexFindAll
返回输入字符串中正则表达式所有匹配项的切片。
最后一个参数 n 确定要返回的子字符串数量,其中 -1 表示返回所有匹配项
上面的代码产生
[2 4 6 8]
如果出现问题,
regexFindAll
会 panic,而 mustRegexFindAll
会向模板引擎返回错误。regexFind, mustRegexFind
返回输入字符串中正则表达式的第一个(最左边)匹配项
上面的代码产生
d1
如果出现问题,
regexFind
会 panic,而 mustRegexFind
会向模板引擎返回错误。regexReplaceAll, mustRegexReplaceAll
返回输入字符串的副本,用替换字符串替换 Regexp 的匹配项。
在字符串替换中,$ 符号按 Expand 中的方式解释,例如 $1 表示第一个子匹配项的文本
上面的代码产生
-W-xxW-
如果出现问题,
regexReplaceAll
会 panic,而 mustRegexReplaceAll
会向模板引擎返回错误。regexReplaceAllLiteral, mustRegexReplaceAllLiteral
返回输入字符串的副本,用替换字符串替换 Regexp 的匹配项
替换字符串直接替换,不使用 Expand
上面的代码产生
-${1}-${1}-
如果出现问题,
regexReplaceAllLiteral
会 panic,而 mustRegexReplaceAllLiteral
会向模板引擎返回错误。regexSplit, mustRegexSplit
将输入字符串切片为由表达式分隔的子字符串,并返回这些表达式匹配项之间的子字符串切片。最后一个参数
n
确定要返回的子字符串数量,其中 -1
表示返回所有匹配项上面的代码产生
[pi a]
如果出现问题,
regexSplit
会 panic,而 mustRegexSplit
会向模板引擎返回错误。regexQuoteMeta
返回一个字符串,该字符串转义参数文本内的所有正则表达式元字符;
返回的字符串是匹配字面文本的正则表达式。
上面的代码产生
1\\.2\\.3
另请参阅...
转换函数 包含用于转换字符串的函数。字符串切片函数 包含用于处理字符串数组的函数。
字符串切片函数
这些函数对字符串切片进行操作或生成字符串切片。在 Go 中,切片是一个可增长的数组。在 Sprig 中,它是
list
的特殊情况。join
将字符串列表连接成单个字符串,使用给定的分隔符。
上面的代码将产生
hello_world
join
将尝试将非字符串转换为字符串值:上面的代码将产生
1+2+3
splitList 和 split
将字符串分割成字符串列表:
上面的代码将返回
[foo bar baz]
较旧的
split
函数将字符串分割成 dict
。它设计为使使用模板点表示法访问成员变得容易:上面的代码产生一个带有索引键的映射。
{_0: foo, _1: bar, _2: baz}
上面的代码产生
foo
splitn
splitn
函数将字符串分割成 dict
。它设计为使使用模板点表示法访问成员变得容易:上面的代码产生一个带有索引键的映射。
{_0: foo, _1: bar$baz}
上面的代码产生
foo
sortAlpha
sortAlpha
函数将字符串列表按字母顺序(字典序)排序。它不会就地排序,而是返回列表的排序副本,以保持列表的不可变性。
整数数学函数
以下数学函数对
int64
值进行操作。add
使用
add
求和。接受两个或更多输入。add1
要增加 1,使用
add1
sub
要减法,使用
sub
div
使用
div
执行整数除法mod
使用
mod
进行模运算mul
使用
mul
进行乘法运算。接受两个或更多输入。max
返回一系列整数中的最大值:
这将返回
3
:min
返回一系列整数中的最小值。
min 1 2 3
将返回 1
floor
返回小于或等于输入值的最大浮点值
floor 123.9999
将返回 123.0
ceil
返回大于或等于输入值的最小浮点值
ceil 123.001
将返回 124.0
round
返回一个浮点值,余数四舍五入到小数点后指定的位数。
round 123.555555 3
将返回 123.556
randInt
返回从最小值(包含)到最大值(不包含)的随机整数值。
上面的代码将在范围 [12,30] 内产生一个随机数。
整数切片函数
until
until
函数构建一个整数范围。上面的代码生成列表
[0, 1, 2, 3, 4]
。这对于使用
range $i, $e := until 5
进行循环很有用。untilStep
与
until
类似,untilStep
生成一个计数整数列表。但它允许您定义开始、停止和步长:上面的代码将从 3 开始,每次加 2,直到等于或大于 6,产生
[3 5]
。这类似于 Python 的 range
函数。seq
工作方式类似于 bash 的
seq
命令。- 1 个参数 (end) - 将生成 1 到
end
(包含)之间的所有计数整数。
- 2 个参数 (start, end) - 将生成
start
到end
(包含)之间的所有计数整数,每次递增或递减 1。
- 3 个参数 (start, step, end) - 将生成
start
到end
(包含)之间的所有计数整数,每次递增或递减step
。
浮点数数学函数
日期函数
now
当前日期/时间。与其他日期函数一起使用。
ago
ago
函数返回从 time.Now 开始的持续时间,以秒为单位。以
time.Duration
String() 格式返回date
date
函数格式化日期。将日期格式化为 YEAR-MONTH-DAY:
Go 中的日期格式化有点不同。
简而言之,以这个为基础日期:
按您想要的格式编写。上面,
2006-01-02
是相同的日期,但格式是我们想要的。dateInZone
与
date
相同,但有时区。duration
将给定的秒数格式化为
time.Duration
。这返回 1m35s
durationRound
将给定的持续时间四舍五入到最重要的单位。字符串和
time.Duration
被解析为持续时间,而 time.Time
被计算为自那时起的持续时间。这返回 2h
这返回 3mo
unixEpoch
返回
time.Time
自 unix 纪元以来的秒数。dateModify, mustDateModify
dateModify
接受一个修改和一个日期,返回时间戳。从当前时间减去一小时三十分钟:
如果修改格式错误,
dateModify
将返回未修改的日期。mustDateModify
将返回错误。htmlDate
htmlDate
函数格式化日期以插入到 HTML 日期选择器输入字段中。htmlDateInZone
与 htmlDate 相同,但有时区。
toDate, mustToDate
toDate
将字符串转换为日期。第一个参数是日期布局,第二个是日期字符串。如果字符串无法转换,它返回零值。
mustToDate
在字符串无法转换时将返回错误。当您想要将字符串日期转换为另一种格式时(使用管道),这很有用。下面的示例将 "2017-12-31" 转换为 "31/12/2017"。
默认值函数
Sprig 提供了为模板设置默认值的工具。
default
要设置简单的默认值,使用
default
:在上面,如果
.Bar
计算为非空值,将使用它。但如果它为空,将返回 foo
。"空"的定义取决于类型:
- 数字:0
- 字符串:""
- 列表:
[]
- 字典:
{}
- 布尔值:
false
- 总是
nil
(即 null)
对于结构体,没有空的定义,所以结构体永远不会返回默认值。
empty
如果给定值被认为是空的,
empty
函数返回 true
,否则返回 false
。空值在 default
部分中列出。注意,在 Go 模板条件中,空性会自动计算。因此,您很少需要
if empty .Foo
。相反,只需使用 if .Foo
。coalesce
coalesce
函数接受一个值列表并返回第一个非空值。上面的代码返回
1
。此函数对于扫描多个变量或值很有用:
上面的代码将首先检查
.name
是否为空。如果不是,它将返回该值。如果它为空,coalesce
将评估 .parent.name
是否为空。最后,如果 .name
和 .parent.name
都为空,它将返回 Matt
。all
all
函数接受一个值列表,如果所有值都是非空的,则返回 true。上面的代码返回
false
。此函数对于评估多个变量或值条件很有用:
上面的代码将检查 http.Request 是否为使用 tls 1.3 和 http/2 的 POST 请求。
any
any
函数接受一个值列表,如果任何值是非空的,则返回 true。上面的代码返回
true
。此函数对于评估多个变量或值条件很有用:
上面的代码将检查 http.Request 方法是否为 GET/POST/OPTIONS 之一。
fromJson, mustFromJson
fromJson
将 JSON 文档解码为结构。如果输入无法解码为 JSON,函数将返回空字符串。
如果 JSON 无效,mustFromJson
将返回错误。toJson, mustToJson
toJson
函数将项目编码为 JSON 字符串。如果项目无法转换为 JSON,函数将返回空字符串。
如果项目无法编码为 JSON,mustToJson
将返回错误。上面的代码返回
.Item
的 JSON 字符串表示。toPrettyJson, mustToPrettyJson
toPrettyJson
函数将项目编码为漂亮的(缩进)JSON 字符串。上面的代码返回
.Item
的缩进 JSON 字符串表示。toRawJson, mustToRawJson
toRawJson
函数将项目编码为 JSON 字符串,HTML 字符不转义。上面的代码返回
.Item
的不转义 JSON 字符串表示。ternary
ternary
函数接受两个值和一个测试值。如果测试值为 true,将返回第一个值。如果测试值为空,将返回第二个值。这类似于 c 三元运算符。true 测试值
或
上面的代码返回
"foo"
。false 测试值
或
上面的代码返回
"bar"
。编码函数
Sprig 提供以下编码和解码函数:
b64enc
/b64dec
:使用 Base64 编码或解码
b32enc
/b32dec
:使用 Base32 编码或解码
列表和列表函数
Sprig 提供了一个简单的
list
类型,可以包含任意的顺序数据列表。这类似于数组或切片,但列表被设计为不可变数据类型。创建一个整数列表:
上面的代码创建一个
[1 2 3 4 5]
的列表。first, mustFirst
要获取列表的第一个项目,使用
first
。first $myList
返回 1
如果出现问题,
first
会 panic,而 mustFirst
会向模板引擎返回错误。rest, mustRest
要获取列表的尾部(除第一个项目外的所有内容),使用
rest
。rest $myList
返回 [2 3 4 5]
如果出现问题,
rest
会 panic,而 mustRest
会向模板引擎返回错误。last, mustLast
要获取列表的最后一个项目,使用
last
:last $myList
返回 5
。这大致相当于反转列表然后调用 first
。initial, mustInitial
这与
last
互补,返回除最后一个元素外的所有元素。
initial $myList
返回 [1 2 3 4]
。如果出现问题,
initial
会 panic,而 mustInitial
会向模板引擎返回错误。append, mustAppend
将新项目附加到现有列表,创建新列表。
上面的代码会将
$new
设置为 [1 2 3 4 5 6]
。$myList
将保持不变。如果出现问题,
append
会 panic,而 mustAppend
会向模板引擎返回错误。prepend, mustPrepend
将元素推送到列表的前面,创建新列表。
上面的代码将产生
[0 1 2 3 4 5]
。$myList
将保持不变。如果出现问题,
prepend
会 panic,而 mustPrepend
会向模板引擎返回错误。concat
将任意数量的列表连接成一个。
上面的代码将产生
[1 2 3 4 5 6 7 8]
。$myList
将保持不变。reverse, mustReverse
产生一个新列表,其中包含给定列表的反转元素。
上面的代码将生成列表
[5 4 3 2 1]
。如果出现问题,
reverse
会 panic,而 mustReverse
会向模板引擎返回错误。uniq, mustUniq
生成一个移除所有重复项的列表。
上面的代码将产生
[1 2]
如果出现问题,
uniq
会 panic,而 mustUniq
会向模板引擎返回错误。without, mustWithout
without
函数从列表中过滤项目。上面的代码将产生
[1 2 4 5]
Without 可以接受多个过滤器:
这将产生
[2 4]
如果出现问题,
without
会 panic,而 mustWithout
会向模板引擎返回错误。has, mustHas
测试列表是否包含特定元素。
上面的代码将返回
true
,而 has "hello" $myList
将返回 false。如果出现问题,
has
会 panic,而 mustHas
会向模板引擎返回错误。compact, mustCompact
接受一个列表并移除具有空值的条目。
compact
将返回一个移除空(即 "")项目的新列表。如果出现问题,
compact
会 panic,而 mustCompact
会向模板引擎返回错误。slice, mustSlice
要获取列表的部分元素,使用
slice list [n] [m]
。它等同于 list[n:m]
。slice $myList
返回[1 2 3 4 5]
。它与myList[:]
相同。
slice $myList 3
返回[4 5]
。它与myList[3:]
相同。
slice $myList 1 3
返回[2 3]
。它与myList[1:3]
相同。
slice $myList 0 3
返回[1 2 3]
。它与myList[:3]
相同。
如果出现问题,
slice
会 panic,而 mustSlice
会向模板引擎返回错误。chunk
要将列表分割成给定大小的块,使用
chunk size list
。这对于分页很有用。这产生列表的列表
[ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 ] ]
。关于列表内部的说明
列表在 Go 中实现为
[]interface{}
。对于嵌入 Sprig 的 Go 开发人员,您可以将 []interface{}
项目传递到模板上下文中,并能够对这些项目使用所有 list
函数。字典和字典函数
Sprig 提供了一个称为
dict
的键/值存储类型("dictionary" 的缩写,如 Python 中)。dict
是一个无序类型。字典的键必须是字符串。但是,值可以是任何类型,甚至是另一个
dict
或 list
。与
list
不同,dict
不是不可变的。set
和 unset
函数将修改字典的内容。dict
创建字典是通过调用
dict
函数并传递一对列表来完成的。以下创建一个包含三个项目的字典:
get
给定一个映射和一个键,从映射中获取值。
上面的代码返回
"value1"
注意,如果找不到键,此操作将简单地返回
""
。不会生成错误。set
使用
set
向字典添加新的键/值对。注意,
set
返回字典(Go 模板函数的要求),所以您可能需要像上面用 $_
赋值那样捕获值。unset
给定一个映射和一个键,从映射中删除该键。
与
set
一样,这返回字典。注意,如果找不到键,此操作将简单地返回。不会生成错误。
hasKey
如果给定的 dict 包含给定的键,
hasKey
函数返回 true
。如果找不到键,这返回
false
。pluck
pluck
函数使得可以提供一个键和多个映射,并获取所有匹配项的列表:上面的代码将返回包含每个找到值的
list
([value1 otherValue1]
)。如果在映射中找不到给定的键,该映射在列表中不会有项目(返回列表的长度将小于调用
pluck
中 dict 的数量)。如果找到键但值为空值,将插入该值。
Sprig 模板中的一个常见习惯是使用
pluck... | first
从字典集合中获取第一个匹配的键。dig
dig
函数遍历嵌套的 dict 集合,从值列表中选择键。如果在关联的 dict 中找不到任何键,它返回默认值。给定一个结构如下的 dict
上面的代码将返回
"curator"
。如果 dict 甚至缺少 user
字段,结果将是 "guest"
。Dig 在您想要避免保护子句的情况下非常有用,特别是因为 Go 模板包的
and
不会短路。例如,and a.maybeNil a.maybeNil.iNeedThis
将始终评估 a.maybeNil.iNeedThis
,如果 a
缺少 maybeNil
字段则会 panic。)dig
最后接受其 dict 参数以支持管道。例如:merge, mustMerge
将两个或更多字典合并为一个,优先考虑目标字典:
这是一个深度合并操作,但不是深度复制操作。合并的嵌套对象在两个 dict 上是相同的实例。如果您想要深度复制以及合并,请使用
deepCopy
函数以及合并。例如,如果合并不成功,
mustMerge
将返回错误。mergeOverwrite, mustMergeOverwrite
将两个或更多字典合并为一个,优先考虑从右到左,有效地覆盖目标字典中的值:
给定:
将导致:
这是一个深度合并操作,但不是深度复制操作。合并的嵌套对象在两个 dict 上是相同的实例。如果您想要深度复制以及合并,请使用
deepCopy
函数以及合并。例如,如果合并不成功,
mustMergeOverwrite
将返回错误。keys
keys
函数将返回一个或多个 dict
类型中所有键的 list
。由于字典是无序的,键不会按可预测的顺序排列。它们可以用 sortAlpha
排序。当提供多个字典时,键将被连接。使用
uniq
函数以及 sortAlpha
来获取唯一的、排序的键列表。pick
pick
函数从字典中选择给定的键,创建一个新的 dict
。上面的代码返回
{name1: value1, name2: value2}
omit
omit
函数类似于 pick
,除了它返回一个包含所有不匹配给定键的键的新 dict
。上面的代码返回
{name2: value2}
values
values
函数类似于 keys
,除了它返回一个包含源 dict
所有值的新 list
(仅支持一个字典)。上面的代码返回
list["value1", "value2", "value 3"]
。注意,values
函数不保证结果的顺序 - 如果您关心这个,请使用 sortAlpha
。deepCopy, mustDeepCopy
deepCopy
和 mustDeepCopy
函数接受一个值并对该值进行深度复制。这包括 dict 和其他结构。当出现问题时 deepCopy
会 panic,而 mustDeepCopy
在出现错误时向模板系统返回错误。关于字典内部的说明
dict
在 Go 中实现为 map[string]interface{}
。Go 开发人员可以将 map[string]interface{}
值传递到上下文中,使它们作为 dict
对模板可用。类型转换函数
Sprig 提供以下类型转换函数:
atoi
:将字符串转换为整数。
float64
:转换为float64
。
int
:转换为系统宽度的int
。
int64
:转换为int64
。
toDecimal
:将 unix 八进制转换为int64
。
toString
:转换为字符串。
toStrings
:将列表、切片或数组转换为字符串列表。
只有
atoi
要求输入是特定类型。其他函数将尝试从任何类型转换为目标类型。例如,int64
可以将浮点数转换为整数,也可以将字符串转换为整数。toStrings
给定一个类似列表的集合,产生字符串切片。
上面的代码将
1
转换为 "1"
,2
转换为 "2"
,依此类推,然后作为列表返回它们。toDecimal
给定 unix 八进制权限,产生十进制数。
上面的代码将
0777
转换为 511
并作为 int64 返回值。路径和文件路径函数
虽然 Sprig 不授予对文件系统的访问权限,但它确实提供了用于处理遵循文件路径约定的字符串的函数。
路径
由斜杠字符(
/
)分隔的路径,由 path
包处理。示例:
- URI 的路径组件:
https://example.com/some/content/
,ftp://example.com/file/
。
base
返回路径的最后一个元素。
上面的代码打印 "baz"。
dir
返回目录,去除路径的最后一部分。所以
dir "foo/bar/baz"
返回 foo/bar
。clean
清理路径。
上面的代码解析
..
并返回 foo/baz
。ext
返回文件扩展名。
上面的代码返回
.bar
。isAbs
要检查路径是否为绝对路径,使用
isAbs
。文件路径
由
os.PathSeparator
变量分隔的路径,由 path/filepath
包处理。这些是在解析本地文件系统路径时推荐的函数,通常在处理本地文件、目录等时使用。
示例:
- 在 Linux 或 MacOS 上运行时,文件系统路径由斜杠字符(
/
)分隔:/home/user/file
,/etc/config
;
- 在 Windows 上运行时,文件系统路径由反斜杠字符(
\\
)分隔:C:\\Users\\Username\\
,C:\\Program Files\\Application\\
;
osBase
返回文件路径的最后一个元素。
上面的代码分别在 Linux 和 Windows 上打印 "baz"。
osDir
返回目录,去除路径的最后一部分。所以
osDir "/foo/bar/baz"
在 Linux 上返回 /foo/bar
,而 osDir "C:\\\\foo\\\\bar\\\\baz"
在 Windows 上返回 C:\\\\foo\\\\bar
。osClean
清理路径。
上面的代码解析
..
并在 Linux 上返回 foo/baz
,在 Windows 上返回 C:\\\\foo\\\\baz
。osExt
返回文件扩展名。
上面的代码分别在 Linux 和 Windows 上返回
.bar
。osIsAbs
要检查文件路径是否为绝对路径,使用
osIsAbs
。UUID 函数
Sprig 可以生成 UUID v4 通用唯一标识符。
上面的代码返回一个新的 v4 类型(随机生成)的 UUID。
操作系统函数
警告: 如果使用不当,这些函数可能导致信息泄露。
警告: Sprig 的一些重要实现(如 Kubernetes Helm)出于安全原因不提供这些函数。
env
env
函数读取环境变量:expandenv
要在字符串中替换环境变量,使用
expandenv
:版本比较函数
某些版本方案易于解析和比较。Sprig 提供了用于处理 SemVer 2 版本的函数。
semver
semver
函数将字符串解析为语义版本:如果解析器失败,它将导致模板执行停止并出现错误。
此时,
$version
是一个指向 Version
对象的指针,具有以下属性:$version.Major
:主版本号(上面的1
)
$version.Minor
:次版本号(上面的2
)
$version.Patch
:补丁版本号(上面的3
)
$version.Prerelease
:预发布版本(上面的alpha.1
)
$version.Metadata
:构建元数据(上面的123
)
$version.Original
:原始版本作为字符串
此外,您可以使用
Compare
函数将 Version
与另一个 version
进行比较:上面的代码将返回
-1
。返回值是:
1
如果给定的 semver 大于调用Compare
方法的 semver
1
如果调用Compare
函数的版本更大
0
如果它们是相同版本
(注意,在 SemVer 中,
Metadata
字段在版本比较操作期间不进行比较。)semverCompare
提供了一个更强大的比较函数
semverCompare
。如果约束匹配,它返回 true
,如果不匹配,则返回 false
。此版本支持版本范围:semverCompare "1.2.3" "1.2.3"
检查精确匹配
semverCompare "^1.2.0" "1.2.3"
检查主版本和次版本匹配,并且第二个版本的补丁号大于或等于第一个参数。
SemVer 函数使用 Masterminds semver 库,来自 Sprig 的创建者。
基本比较
比较有两个元素。首先,比较字符串是空格或逗号分隔的 AND 比较列表。然后这些由 || (OR) 比较分隔。例如,
">= 1.2 < 3.0.0 || >= 4.2.3"
正在寻找大于或等于 1.2 且小于 3.0.0 或大于或等于 4.2.3 的比较。基本比较是:
=
:等于(别名为无操作符)
!=
:不等于
>
:大于
<
:小于
>=
:大于或等于
<=
:小于或等于
注意,根据语义版本规范,预发布版本可能与其发布版本不对应 API 兼容。它说,
处理预发布版本
预发布版本,对于不熟悉的人来说,用于稳定或普遍可用发布之前的软件发布。预发布的例子包括开发、alpha、beta 和发布候选版本。预发布可能是
1.2.3-beta.1
这样的版本,而稳定发布将是 1.2.3
。在优先级顺序中,预发布在其关联发布之前。在这个例子中 1.2.3-beta.1 < 1.2.3
。根据语义版本规范,预发布版本可能与其发布版本不对应 API 兼容。它说,
预发布版本表示该版本不稳定,可能不满足由其关联的正常版本表示的预期兼容性要求。
使用没有预发布比较器的约束的 SemVer 比较将跳过预发布版本。例如,
>=1.2.3
在查看发布列表时将跳过预发布,而 >=1.2.3-0
将评估并找到预发布。示例比较中使用
0
作为预发布版本的原因是因为根据规范,预发布只能包含 ASCII 字母数字和连字符(以及 .
分隔符)。排序按 ASCII 排序顺序进行,同样根据规范。ASCII 排序顺序中最低的字符是 0
(参见 ASCII 表)理解 ASCII 排序顺序很重要,因为 A-Z 在 a-z 之前。这意味着
>=1.2.3-BETA
将返回 1.2.3-alpha
。您可能期望的大小写敏感性在这里不适用。这是由于 ASCII 排序顺序,这是规范指定的。连字符范围比较
有多种方法处理范围,第一种是连字符范围。这些看起来像:
1.2 - 1.4.5
等同于>= 1.2 <= 1.4.5
2.3.4 - 4.5
等同于>= 2.3.4 <= 4.5
比较中的通配符
x
、X
和 *
字符可以用作通配符字符。这适用于所有比较操作符。当在 =
操作符上使用时,它回退到补丁级别比较(见下面的波浪号)。例如,1.2.x
等同于>= 1.2.0, < 1.3.0
>= 1.2.x
等同于>= 1.2.0
<= 2.x
等同于< 3
- 等同于
>= 0.0.0
波浪号范围比较(补丁)
波浪号(
~
)比较操作符用于指定次版本时的补丁级别范围,以及缺少次版本号时的主级别更改。例如,~1.2.3
等同于>= 1.2.3, < 1.3.0
~1
等同于>= 1, < 2
~2.3
等同于>= 2.3, < 2.4
~1.2.x
等同于>= 1.2.0, < 1.3.0
~1.x
等同于>= 1, < 2
脱字符范围比较(主版本)
脱字符(
^
)比较操作符用于稳定(1.0.0)发布发生后的主级别更改。在 1.0.0 发布之前,次版本作为 API 稳定性级别。这在 API 版本比较中很有用,因为主版本更改会破坏 API。例如,^1.2.3
等同于>= 1.2.3, < 2.0.0
^1.2.x
等同于>= 1.2.0, < 2.0.0
^2.3
等同于>= 2.3, < 3
^2.x
等同于>= 2.0.0, < 3
^0.2.3
等同于>=0.2.3 <0.3.0
^0.2
等同于>=0.2.0 <0.3.0
^0.0.3
等同于>=0.0.3 <0.0.4
^0.0
等同于>=0.0.0 <0.1.0
^0
等同于>=0.0.0 <1.0.0
反射函数
Sprig 提供基本的反射工具。这些帮助高级模板开发人员理解特定值的基础 Go 类型信息。
Go 有几个基本种类,如
string
、slice
、int64
和 bool
。Go 有一个开放的类型系统,允许开发人员创建自己的类型。
Sprig 为每个提供了一组函数。
种类函数
有两个种类函数:
kindOf
返回对象的种类。上面的代码将返回
string
。对于简单测试(如在 if
块中),kindIs
函数将让您验证值是否为特定种类:上面的代码将返回
true
类型函数
类型稍微难处理一些,所以有三个不同的函数:
typeOf
返回值的基础类型:typeOf $foo
typeIs
类似于kindIs
,但用于类型:typeIs "*io.Buffer" $myVal
typeIsLike
工作方式与typeIs
相同,除了它还解引用指针。
注意: 这些都不能测试某物是否实现了给定的接口,因为这样做需要提前编译接口。
deepEqual
如果两个值是"深度相等",
deepEqual
返回 true也适用于非基本类型(与内置
eq
相比)。上面的代码将返回
true
加密和安全函数
Sprig 提供了一些高级加密函数。
sha1sum
sha1sum
函数接收一个字符串,并计算其 SHA1 摘要。sha256sum
sha256sum
函数接收一个字符串,并计算其 SHA256 摘要。上面的代码将以"ASCII 装甲"格式计算 SHA 256 和,这种格式可以安全打印。
sha512sum
sha512sum
函数接收一个字符串,并计算其 SHA512 摘要。上面的代码将以"ASCII 装甲"格式计算 SHA 512 和,这种格式可以安全打印。
adler32sum
adler32sum
函数接收一个字符串,并计算其 Adler-32 校验和。bcrypt
bcrypt
函数接收一个字符串,并生成其 bcrypt
哈希。htpasswd
htpasswd
函数接受 username
、password
和 hashAlgorithm
,并生成密码的 bcrypt
(推荐)或 base64 编码并前缀的 sha
哈希。hashAlgorithm
是可选的,默认为 bcrypt
。结果可用于 Apache HTTP Server 的基本认证。注意,直接在模板中存储密码是不安全的。
randBytes
randBytes
函数接受计数 N
并生成加密安全的(使用 crypto/rand
)N
字节随机序列。序列作为 base64 编码字符串返回。derivePassword
derivePassword
函数可用于基于某些共享的"主密码"约束派生特定密码。此算法是明确定义的。注意,直接在模板中存储各个部分被认为是不安全的。
genPrivateKey
genPrivateKey
函数生成编码到 PEM 块中的新私钥。它为其第一个参数接受以下值之一:
ecdsa
:生成椭圆曲线 DSA 密钥(P256)
dsa
:生成 DSA 密钥(L2048N256)
rsa
:生成 RSA 4096 密钥
ed25519
:生成 Ed25519 密钥
buildCustomCert
buildCustomCert
函数允许自定义证书。它接受以下字符串参数:
- base64 编码的 PEM 格式证书
- base64 编码的 PEM 格式私钥
它返回具有以下属性的证书对象:
Cert
:PEM 编码的证书
Key
:PEM 编码的私钥
示例:
注意,返回的对象可以传递给
genSignedCert
函数以使用此 CA 签名证书。genCA
genCA
函数使用 2048 位 RSA 私钥生成新的自签名 x509 证书颁发机构。它接受以下参数:
- 主题的通用名称(cn)
- 证书有效期(天数)
它返回具有以下属性的对象:
Cert
:PEM 编码的证书
Key
:PEM 编码的私钥
示例:
注意,返回的对象可以传递给
genSignedCert
函数以使用此 CA 签名证书。genCAWithKey
genCAWithKey
函数使用给定的私钥生成新的自签名 x509 证书颁发机构。它接受以下参数:
- 主题的通用名称(cn)
- 证书有效期(天数)
- 私钥(PEM 编码);不支持 DSA 密钥
它返回具有以下属性的对象:
Cert
:PEM 编码的证书
Key
:PEM 编码的私钥
示例:
注意,返回的对象可以传递给
genSignedCert
函数以使用此 CA 签名证书。genSelfSignedCert
genSelfSignedCert
函数使用 2048 位 RSA 私钥生成新的自签名 x509 证书。它接受以下参数:
- 主题的通用名称(cn)
- 可选的 IP 列表;可能为 nil
- 可选的备用 DNS 名称列表;可能为 nil
- 证书有效期(天数)
它返回具有以下属性的对象:
Cert
:PEM 编码的证书
Key
:PEM 编码的私钥
示例:
genSelfSignedCertWithKey
genSelfSignedCertWithKey
函数使用给定的私钥生成新的自签名 x509 证书。它接受以下参数:
- 主题的通用名称(cn)
- 可选的 IP 列表;可能为 nil
- 可选的备用 DNS 名称列表;可能为 nil
- 证书有效期(天数)
- 私钥(PEM 编码);不支持 DSA 密钥
它返回具有以下属性的对象:
Cert
:PEM 编码的证书
Key
:PEM 编码的私钥
示例:
genSignedCert
genSignedCert
函数使用 2048 位 RSA 私钥生成由指定 CA 签名的新 x509 证书。它接受以下参数:
- 主题的通用名称(cn)
- 可选的 IP 列表;可能为 nil
- 可选的备用 DNS 名称列表;可能为 nil
- 证书有效期(天数)
- CA(见
genCA
)
示例:
genSignedCertWithKey
genSignedCertWithKey
函数使用给定的私钥生成由指定 CA 签名的新 x509 证书。它接受以下参数:
- 主题的通用名称(cn)
- 可选的 IP 列表;可能为 nil
- 可选的备用 DNS 名称列表;可能为 nil
- 证书有效期(天数)
- CA(见
genCA
)
- 私钥(PEM 编码);不支持 DSA 密钥
示例:
encryptAES
encryptAES
函数使用 AES-256 CBC 加密文本并返回 base64 编码字符串。decryptAES
decryptAES
函数接收由 AES-256 CBC 算法编码的 base64 字符串并返回解码的文本。URL 函数
上一篇
性能优化
下一篇
Markdown语法输入
Loading...