使用自訂字段比較器在Go 中進行優雅的數組排序
按特定字段對結構體數組進行排序可能是GoGo程式設計中的常見任務。讓我們探索一種高效且可自訂的方法來實現這一目標。
問題:
給定如下所示的結構數組:
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中文網其他相關文章!