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