gpt4 book ai didi

go - 有没有一种方法可以计算Go模板?

转载 作者:行者123 更新时间:2023-12-01 22:21:03 24 4
gpt4 key购买 nike

我正在尝试为epub创建toc.ncx(只是XML)文件。
在这种toc中,定义了<navpoint>,每个都有一个id和一个“playorder”。
Go模板有什么方法可以简单地计算导航点吗?
我想到了这样的事情(无效的模板代码)

{{$counter := 0}}
{{define "NAVPOINT"}}
{{$counter = $counter + 1}}
<navpoint id="{{.}}" playorder="{{$counter}}">
{{end}}

{{range .TopLevel }}
{{template "NAVPOINT" .Id}}
{{range .SecondLevel }}
{{template "NAVPOINT" .Id}}
</navpoint>
{{end}}
</navpoint>
{{end}}
示例结构
  { TopLevel: [
{
Id: "id-a"
SecondLevel: [
{
Id: "scnd-a"
}
{
Id: "scnd-b"
}
]
}
{
Id: "id-b"
SecondLevel: [
{
Id: "scnd-c"
}
{
Id: "scnd-d"
}
]
}
}
然后会给我这样的东西
  <navpoint id="id-a"      playorder="1">
<navpoint id="scnd-a" playorder="2"></navpoint>
<navpoint id="scnd-b" playorder="3"></navpoint>
</navpoint>
<navpoint id="id-b" playorder="4">
<navpoint id="scnd-c" playorder="5"></navpoint>
<navpoint id="scnd-d" playorder="6"></navpoint>
</navpoint>

我想我可以使用模板功能而不是模板来实现此目的,但是不知道如何实现此目的。模板功能可以有计数器吗?

最佳答案

感谢@icza,我在这里找到了解决方案:Go template remove the last comma in range loop
这就是我现在使用的功能:

"navpoint": func() func(...string) string {
i := 0
return func(id ...string) string {
if len(id) < 1 {
return "</navPoint>"
}
i++
return `<navPoint id="` + id[0] + `" playorder"` + strconv.Itoa(i) + `">`
}
},
我在模板中以这种方式使用它:
{{$navpoint := navpoint}}
{{range .TopLevel }}
{{call $navpoint .Id}}
{{range .SecondLevel }}
{{call $navpoint .Id}}
{{call $navpoint}}
{{end}}
{{call $navpoint}}
{{end}}
如果使用id(XX)调用“navpoint”,则会给出开始标记 <navpoint id="XX" playorder="##">。在没有id的情况下调用时,它给出结束标记 </navpoint>

关于go - 有没有一种方法可以计算Go模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63551935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com