我尝试使用此模板行从“2020-03-09T08:09:40.000+0000”获取日期(2020-03-09):
... [Ticket:{{- .key -}}:{{ .fields.resolution.name }}] starts {{ slice .fields.created 0 10 }} and ends {{ slice .fields.resolutiondate 0 10 }} ...
--> 无效用法:模板:gojira:7:62:在
文档说:
切片
slice 返回将其第一个参数切片的结果 剩余的论点。因此,“slice x 1 2”在 Go 语法中是 x[1:2], 而“切片 x”是 x[:],“切片 x 1”是 x[1:],“切片 x 1 2 3” 是 x[1:2:3]。第一个参数必须是字符串、切片或数组。
这是我在 go-jira 中使用的完整模板:
@startgantt
{{ range .issues -}}
[Ticket:{{- .key -}}:{{ .fields.resolution.name }}] starts {{ slice .fields.created 0 10 }} and ends {{ slice .fields.resolutiondate 0 10 }}
[Ticket:{{- .key -}}:{{ .fields.resolution.name }}] is colored Yellow
{{ if (and .fields.customfield_11202 .fields.customfield_11203) -}}
[Planned:{{- .key -}}:{{ .fields.resolution.name }}] starts {{ .fields.customfield_11202 }} and ends {{ .fields.customfield_11203 }}
[Planned:{{- .key -}}:{{ .fields.resolution.name }}] is colored LightBlue
{{ end -}}
{{ end -}}
@endgantt
slice
函数是在Go 1.13中添加的,因此如果您按照评论中所述使用Go 1.10.4,则解析引擎不知道该函数。 Go-jira 可能会添加一个具有此名称的函数,但可能不支持字符串切片。
最好是升级到 Go 1.13 或更高版本,并且这个
slice
函数将准备好对字符串进行切片,如本例所示:
t := template.Must(template.New("").Parse(`{{slice . 1 3}}`))
if err := t.Execute(os.Stdout, "012345"); err != nil {
panic(err)
}
哪个输出(在Go Playground上尝试一下):
12
我认为您不希望在 .fields.created 周围加上引号,因为您最终会得到该字符串,而不是您想要的日期,因此需要修复,但不应导致此错误。
这个完整的模板(有一些细微的变化)至少可以与最新的版本一起使用:
https://play.golang.org/p/fkK8DKyj9jy
t := template.Must(template.New("").Parse(`[Ticket:{{- .key -}}:{{ .fields.resolutionname }}] starts {{ slice .fields.created 0 10 }} and ends {{ slice .fields.resolutiondate 0 10 }} `))
data := map[string]interface{}{
"key":"key",
"fields":map[string]string{"created":"2020-03-09T08:09:40.000+0000",
"resolutionname":"name",
"resolutiondate":"2020-03-09T08:09:40.000+0000"},
}
err := t.Execute(os.Stdout, data)
您使用哪个库来输出此模板,我假设是文本/模板?
切片函数的引入相对较新,但无论如何它都不会给出该错误。您确定没有在 func 映射中重新定义切片吗?这似乎是最可能的解释,因为切片函数在任何情况下都不会给出您引用的错误。
您可以尝试单独使用字符串对该切片函数进行简单测试吗,例如上面的 play.golang.org 链接,但使用您的模板?
调用切片时出错:列表应该是切片或数组类型,而不是字符串
当我使用的模板处理器注册了 sprig 函数时,我遇到了同样的错误。 Sprig 有一个
slice
函数,适用于列表/数组,但不适用于字符串。注册它会覆盖可以处理字符串的默认 slice
中的 text/template
。