gpt4 book ai didi

go - 如何在 go 中使用模板进行排名

转载 作者:IT王子 更新时间:2023-10-29 01:47:16 28 4
gpt4 key购买 nike

我在json中有一些数据

[
{
"group":"a",
"value":"10"

},
{
"group":"a",
"value":"11"

},
{
"group":"b",
"value":"2"

},
{
"group":"b",
"value":"3"

}
]

或作为表格以使其更易于阅读...

group   value
a 10
a 11
b 2
b 3

我想按排名

group   value     rank
a 10 1
a 11 2
b 2 1
b 3 2

在其他语言中,我会使用一个计数器循环遍历数据,该计数器会在有新的 group 值时重置。我可以浏览数据,但我无法让计数器工作。在下面的示例中,以前的计数器值似乎没有保留在下一次迭代中,因此每个值都是 1。

{{ $counter := 1 }}

{{- range $index, $element := $data }}

{{ inline (gt $index 0) "," "" }}

{
"group" : "{{ .group }}",
"value" : "{{ .value }}",
"rank" : "{{ $counter }}"
{{ $counter := add $counter 1 }}
}

{{- end -}}

最佳答案

在显示例程中实现这种逻辑违背了 go 模板的设计理念,并且通常违反了 separation of concerns 的概念。 .

也就是说,模板是一个显示(或“演示”)问题,而您在此处描述的排名是一个排序(或“业务逻辑”)问题。通过在显示组件中执行排序,您会使程序变得脆弱,因为这些关注点不能相互独立地改变,也不能在一般意义上重用。例如,如果您想将元素打印为 JSON 或 YAML 数据,包括它们的排名,您将不得不重新实现您在文本模板中编写的排名逻辑;如果排名由于某种原因发生变化,那么您将不得不在多个地方进行更改。

更好的方法是创建一个函数来按需对元素进行排名,而不管您如何显示它们。通过这种方式,您的程序在很多方面都更加健壮,主要是因为您需要仅在项目发生变化时对项目进行排名,而不是每次显示它们时。

例如 ( Go Playground ):

type Item struct {
Group string `json:"group"`
Value int `json:"value,string"`
Rank int `json:"rank,omitempty"`
}

func main() {
// Parse the items.
var items []Item
err := json.Unmarshal([]byte(jsonstr), &items)
check(err)

// Rank the items.
RankItems(items)

// Display the items.
PrintTable(items)
PrintJSON(items)
PrintYAML(items) // etc...
}

func RankItems(xs []Item) {
// Order the items by group, value.
sort.Slice(xs, func(i, j int) bool {
x1, x2 := xs[i], xs[j]
if x1.Group == x2.Group {
return x1.Value < x2.Value
}
return x1.Group < x2.Group
})
// Rank the items by position within a group.
var lastGroup string
var nextRank int
for i := range xs {
if i == 0 || lastGroup != xs[i].Group {
nextRank = 1
}
xs[i].Rank = nextRank
lastGroup = xs[i].Group
nextRank++
}
}

关于go - 如何在 go 中使用模板进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46875100/

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