Q: go-jira: slice 不在模板中分割字符串
Q: go-jira: slice is not slicing strings in templates
我尝试使用此模板行从“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:在 处执行“gojira”:调用切片时出错:列表应为切片或数组类型,但应为字符串
文档说:
slice
slice returns the result of slicing its first argument by the
remaining arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2],
while "slice x" is x[:], "slice x 1" is x[1:], and "slice x 1 2 3"
is x[1:2:3]. The first argument must be a string, slice, or array.
这是我在 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
我认为您不需要 .fields.created 周围的引号,因为您最终会得到该字符串,而不是您想要的日期,因此需要修复它但不应导致此错误。
这个完整的模板(有一些小的改动)至少适用于最新的 go:
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)
你用哪个库来输出这个模板,我猜text/template?
slice 函数的引入是相对较新的,但它并没有给出那个错误。您确定您没有在 func 映射中重新定义 slice 吗?这似乎是最可能的解释,因为 slice 函数在任何情况下都不会给出您引用的错误。
你能尝试单独用一个字符串对该切片函数进行简单测试吗,就像上面的 play.golang.org link,但使用你的模板?
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
我尝试使用此模板行从“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 returns the result of slicing its first argument by the remaining arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2], while "slice x" is x[:], "slice x 1" is x[1:], and "slice x 1 2 3" is x[1:2:3]. The first argument must be a string, slice, or array.
这是我在 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
我认为您不需要 .fields.created 周围的引号,因为您最终会得到该字符串,而不是您想要的日期,因此需要修复它但不应导致此错误。
这个完整的模板(有一些小的改动)至少适用于最新的 go:
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)
你用哪个库来输出这个模板,我猜text/template?
slice 函数的引入是相对较新的,但它并没有给出那个错误。您确定您没有在 func 映射中重新定义 slice 吗?这似乎是最可能的解释,因为 slice 函数在任何情况下都不会给出您引用的错误。
你能尝试单独用一个字符串对该切片函数进行简单测试吗,就像上面的 play.golang.org link,但使用你的模板?
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