我想為結構的 2D 切片創建一致的順序,我正在從地圖創建 2D 切片,因此順序總是不同的。
我的結構看起來像
// Hit contains the data for a hit.
type Hit struct {
Key string `json:"key"`
Data []Field `json:"data"`
}
// Hits stores a list of hits.
type Hits [][]Hit
我想為我的Hits型別的內容提供一致的順序。
我試過了:
func (c Hits) Len() int { return len(c) }
func (c Hits) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
func (c Hits) Less(i, j int) bool { return strings.Compare(c[i][0].Key, c[j][0].Key) == -1 }
但結果似乎仍然以隨機順序回傳。
我正在考慮可能對切片中的每個專案進行散列,但認為可能有一個更簡單的選擇
uj5u.com熱心網友回復:
對 a 的迭代順序map,因為它是一個哈希表是相當不確定的(實際上不是——將具有相同鍵的項以相同的確切順序插入到 2 個映射中,并且每個映射的迭代順序將是相同的)。
假設您的地圖是 a map[string]Hit,要以確定的順序對其進行迭代,我將列舉地圖中的鍵集,對其進行排序,然后使用該排序集來列舉地圖。
像這樣的東西:
package main
import (
"fmt"
"sort"
)
type Hit struct {
Key string `json:"key"`
Data []Field `json:"data"`
}
type Field struct {
Value string `json:"value"`
}
func main() {
var mapOfHits = getSomeHits()
var sortedHits = sortHits(mapOfHits)
for _, h := range sortedHits {
fmt.Println(h.Key)
}
}
func getSomeHits() map[string]Hit {
return make(map[string]Hit, 0)
}
func sortHits(m map[string]Hit) []Hit {
keys := make([]string, 0, len(m))
sorted := make([]Hit, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
sorted = append(sorted, m[k])
}
return sorted
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473033.html
