使用自定义字段比较器在 Go 中进行优雅的数组排序
按特定字段对结构体数组进行排序可能是 Go 编程中的常见任务。让我们探索一种高效且可定制的方法来实现这一目标。
问题:
给定如下所示的结构数组:
type Planet struct { Name string `json:"name"` Aphelion float64 `json:"aphelion"` // in million km Perihelion float64 `json:"perihelion"` // in million km Axis int64 `json:"Axis"` // in km Radius float64 `json:"radius"` }
我们如何通过 Axis 字段对这个数组进行排序?
解决方案:
从 Go 1.8 开始,sort.Slice 函数提供了一种使用自定义比较函数对切片进行排序的便捷方法。要按轴对行星数组进行排序,我们可以使用以下代码:
import "sort" // Define a comparison function to compare planets by their Axis value. var sortByAxis = func(i, j int) bool { return planets[i].Axis < planets[j].Axis } // Create a slice over the array and sort it using the custom comparison function. sort.Slice(planets[:], sortByAxis)
使用数组与切片:
通常,建议使用切片在 Go 中优于数组,因为切片更加灵活和高效。然而,在本例中,planets 变量被声明为数组。为了使其与 sort.Slice 一起使用,我们需要使用planets[:]将其与切片叠加。
排序和维护数组结构:
这很重要请注意,排序操作会就地修改数组。如果您希望保持原始数组结构,可以在排序之前创建切片的副本:
planetSlice := make([]Planet, len(planets)) copy(planetSlice, planets) sort.Slice(planetSlice, sortByAxis)
这允许您在不影响原始数组的情况下使用排序后的切片。
以上是如何通过自定义字段对 Go Struct 数组进行高效排序?的详细内容。更多信息请关注PHP中文网其他相关文章!