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

hasPrefixhasSuffix 函数测试字符串是否具有给定的前缀或后缀:
上面的代码返回 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) - 将生成 startend(包含)之间的所有计数整数,每次递增或递减 1。
  • 3 个参数 (start, step, end) - 将生成 startend(包含)之间的所有计数整数,每次递增或递减 step
 

浮点数数学函数

所有数学函数都对 float64 值进行操作。

addf

使用 addf 求和
这将返回 5.5

add1f

要增加 1,使用 add1f

subf

要减法,使用 subf
这相当于 7.5 - 2 - 3 并将返回 2.5

divf

使用 divf 执行浮点除法
这相当于 10 / 2 / 4 并将返回 1.25

mulf

使用 mulf 进行乘法运算
这将返回 6

maxf

返回一系列浮点数中的最大值:
这将返回 3

minf

返回一系列浮点数中的最小值。
这将返回 1.5
 

日期函数

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 是一个无序类型。
字典的键必须是字符串。但是,值可以是任何类型,甚至是另一个 dictlist
list 不同,dict 不是不可变的。setunset 函数将修改字典的内容。

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

deepCopymustDeepCopy 函数接受一个值并对该值进行深度复制。这包括 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
 

流程控制函数

fail

无条件返回空 string 和具有指定文本的 error。这在其他条件已确定模板渲染应该失败的情况下很有用。
 

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

比较中的通配符

xX* 字符可以用作通配符字符。这适用于所有比较操作符。当在 = 操作符上使用时,它回退到补丁级别比较(见下面的波浪号)。例如,
  • 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 有几个基本种类,如 stringsliceint64bool
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 函数接受 usernamepasswordhashAlgorithm,并生成密码的 bcrypt(推荐)或 base64 编码并前缀的 sha 哈希。hashAlgorithm 是可选的,默认为 bcrypt。结果可用于 Apache HTTP Server 的基本认证。
注意,直接在模板中存储密码是不安全的。

randBytes

randBytes 函数接受计数 N 并生成加密安全的(使用 crypto/randN 字节随机序列。序列作为 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 字符串并返回解码的文本。
 

网络函数

Sprig 网络操作函数。

getHostByName

getHostByName 接收一个域名并返回其 IP 地址。
 

URL 函数

urlParse

解析字符串为 URL,并生成包含 URL 各部分的字典
上面的代码返回一个包含 URL 对象的字典:

urlJoin

将(由 urlParse 生成的)map 组合成 URL 字符串
上面的代码返回如下字符串:
 
 
上一篇
性能优化
下一篇
Markdown语法输入
Loading...
目录
文章列表
思源笔记用户指南
🍼新手引导
✏️基础操作
⛓️基础块
🧬高级块
📊数据库
🛹特色功能
🚀高级操作
💎会员特权
🖼️主题推荐
🔌常用插件
🔡代码片段
💬交流区
❇️思源进阶