国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go Map 加有序排序的一些掙扎

開發(fā) 前端
雖然社區(qū)很多人提過很多種不同的建議。但,顯然,Go 核心團隊不是無法實現(xiàn)一個帶穩(wěn)定排序的 map 類型。為此在實現(xiàn)上要付出較高的改造代價和性能、開銷風險。外加 less is more 的設計哲學。導致此項功能特性一直停滯不前。

大家好,我是煎魚。

最近我有一個朋友又跟 map 扯上關(guān)系了,翻了個車。寫 Go 項目真的是和 map 藕斷絲連,時刻要注意。

今天看到社區(qū)內(nèi) map 加有序排序又各種掙扎過好幾輪。今天拋磚引玉。看看大家有沒有好的思路。

快速背景

Go 提供了一種內(nèi)置的 map 類型,它實現(xiàn)了一個哈希表,在 Go 程序中普遍應用廣泛,能夠做一系列的增刪改查。

類型簽名如下:

map[KeyType]ValueType

最小演示代碼:

func main() {
 m := make(map[int32]string)
 m[0] = "煎魚1"
 m[1] = "煎魚2"
 m[2] = "煎魚3"
 m[3] = "煎魚4"
 m[4] = "煎魚5"
 m[5] = "煎魚6"
 for k, v := range m {
  log.Printf("k: %v, v: %v", k, v)
 }
}

輸出結(jié)果:

$ go run demo.go
2023/12/28 23:36:02 k: 2, v: 煎魚3
2023/12/28 23:36:02 k: 3, v: 煎魚4
2023/12/28 23:36:02 k: 4, v: 煎魚5
2023/12/28 23:36:02 k: 5, v: 煎魚6
2023/12/28 23:36:02 k: 0, v: 煎魚1
2023/12/28 23:36:02 k: 1, v: 煎魚2

輸出結(jié)果看著沒有什么問題。但細心查看的同學應該發(fā)現(xiàn)了。在遍歷 map 類型時,訪問結(jié)果是無序的。明顯多執(zhí)行幾次就會發(fā)現(xiàn)與我們聲明的順序不一致。

社區(qū)討論

這可不。這么尷尬的無序結(jié)果。對于初學者而言很容易導致潛在的 BUG,引發(fā)一些問題/事故。

大家為此做出過努力。提出過各種提案。例如:

  • 《proposal: Go 2: add native type for map that maintains key order[1]》
  • 《proposal: add string key sorted map as built in type[2]》
  • 《proposal: Add a sorting function for map[3]》

基于這些提案,也有人提出了新的關(guān)鍵字 sortedMap:

type User struct{
   UserId string
   Name string
}

func main(){
  db := sortedMap[string]*User{}
  db["煎魚2"] = &User{UserId:"煎魚2",Name:"n2"}
  db["煎魚1"] = &User{UserId:"煎魚1",Name:"n1"}
  for userId, user := range db {
    fmt.Println(userId, user.Name)
  }

  // should output
  // 煎魚1 n1
  // 煎魚2 n2
}

但最終都失敗告終。原因不外乎以下幾類原因:

  • Go1 兼容性保障規(guī)范:對 map 類型從無序改到有序,必然會存在破壞性變更。這活現(xiàn)在干不了。以后未來的 Go2 再說吧(拖字訣)。
  • 排序后 map 的速度慢:如果將默認映射類型改為排序映射,那么不需要排序映射實現(xiàn)或已編寫代碼在需要時對鍵進行排序的人都會受到懲罰。(via @Dave Cheney)
  • 實現(xiàn)穩(wěn)定排序的 map 麻煩:Go 在標準庫 fmt 里實現(xiàn)了穩(wěn)定排序的 map 輸出,整體實現(xiàn)較為難以解決。言外之意不建議將穩(wěn)定排序加入 map 類型的支持內(nèi)。(via @Rob Pike)

參考實現(xiàn)

Go 核心團隊推薦查看:https://github.com/golang/go/blob/master/src/internal/fmtsort/sort.go 的實現(xiàn)邏輯。如果要對 map 類型做穩(wěn)定排序。要做一樣的事情,甚至更多。

說白了,就是要做大小對比、順序排序。還要適配所有的類型。

對應源代碼的其中一角:

type SortedMap struct {
 Key   []reflect.Value
 Value []reflect.Value
}

func (o *SortedMap) Len() int           { return len(o.Key) }
func (o *SortedMap) Less(i, j int) bool { return compare(o.Key[i], o.Key[j]) < 0 }
func (o *SortedMap) Swap(i, j int) {
 o.Key[i], o.Key[j] = o.Key[j], o.Key[i]
 o.Value[i], o.Value[j] = o.Value[j], o.Value[i]
}

func Sort(mapValue reflect.Value) *SortedMap {
 if mapValue.Type().Kind() != reflect.Map {
  return nil
 }

 n := mapValue.Len()
 key := make([]reflect.Value, 0, n)
 value := make([]reflect.Value, 0, n)
 iter := mapValue.MapRange()
 for iter.Next() {
  key = append(key, iter.Key())
  value = append(value, iter.Value())
 }
 sorted := &SortedMap{
  Key:   key,
  Value: value,
 }
 sort.Stable(sorted)
 return sorted
}

func compare(aVal, bVal reflect.Value) int {
 aType, bType := aVal.Type(), bVal.Type()
 if aType != bType {
  return -1 // No good answer possible, but don't return 0: they're not equal.
 }
 switch aVal.Kind() {
 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  a, b := aVal.Int(), bVal.Int()
  switch {
  case a < b:
   return -1
  case a > b:
   return 1
  default:
   return 0
  }
 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:

  ...

}

如果只是標準庫 fmt 輸出流用到,常規(guī)的實現(xiàn)就行。但如果內(nèi)置到 map 類型中,就還要考量性能、開銷、可維護性的綜合因素。折騰起來也是不太妙的,會引入不少的復雜度。

總結(jié)

雖然社區(qū)很多人提過很多種不同的建議。但,顯然,Go 核心團隊不是無法實現(xiàn)一個帶穩(wěn)定排序的 map 類型。

為此在實現(xiàn)上要付出較高的改造代價和性能、開銷風險。外加 less is more 的設計哲學。導致此項功能特性一直停滯不前。

這個大背景下,大家也慢慢還是選擇了第三條路。使用第三方庫,或者配合 slice 來做,要不就是基于近年的泛型來實現(xiàn)了。

參考資料

[1]proposal: Go 2: add native type for map that maintains key order: https://github.com/golang/go/issues/41289

[2]proposal: add string key sorted map as built in type: https://github.com/golang/go/issues/22865

[3]proposal: Add a sorting function for map: https://github.com/golang/go/issues/39291

責任編輯:武曉燕 來源: 腦子進煎魚了
相關(guān)推薦

2020-10-12 08:03:51

Go語言編程

2022-11-03 09:28:20

GoFrameGomap

2021-09-27 10:04:03

Go程序處理

2021-09-27 15:33:48

Go 開發(fā)技術(shù)

2021-02-20 17:16:39

Go語言Go開發(fā)者編程

2013-07-02 10:18:20

編程編程策略

2013-07-02 09:43:02

編程策略

2011-06-01 16:50:21

JAVA

2016-11-16 21:18:42

android日志

2020-02-03 16:03:36

疫情思考

2009-06-25 09:50:32

JSF

2009-06-18 14:54:52

Spring AOP

2010-09-28 14:14:19

SQL語句

2009-09-21 17:46:25

Hibernate數(shù)據(jù)

2013-03-29 13:17:53

XCode調(diào)試技巧iOS開發(fā)

2011-07-13 09:13:56

Android設計

2012-05-21 10:13:05

XCode調(diào)試技巧

2009-07-21 09:55:45

iBATIS分頁

2011-03-15 17:46:43

2021-06-08 06:13:16

React開發(fā)開發(fā)技術(shù)
點贊
收藏

51CTO技術(shù)棧公眾號

国产+成+人+亚洲欧洲自线| 欧美日韩免费不卡视频一区二区三区| 1024av视频| 国产精品久久久久天堂| 成年人在线观看网站| 精品电影一区二区三区| 在线播放一区二区精品视频| 免费在线成人av| 国产午夜精品久久久久久久 | 国产精品www网站| 蜜桃av综合| 538任你躁在线精品免费| 91精品欧美综合在线观看最新| 亚洲日本va午夜在线电影| 99久久久久国产精品免费| 91麻豆免费观看| 91在线品视觉盛宴免费| 97精品视频在线播放| 久久精品国产99久久6| 蜜桃臀av在线| 美女福利视频一区| 久久久久免费| 香蕉自在线视频| 久久在精品线影院精品国产| 日韩精品91亚洲二区在线观看| 国内精品卡一卡二卡三新区| 久久手机精品视频| 青青草91视频| 中文字幕日本在线观看| 欧洲成人免费aa| 成人久久视频在线观看| 日本在线观看网站| 国产欧美日韩高清| 国产精品日韩成人| 亚洲综合av一区二区三区| 美脚丝袜一区二区三区在线观看| 亚洲一区二区三区视频在线播放| 国产aa精品| 四虎4hu永久免费入口| 91精品国产综合久久久久久久 | 色呦哟—国产精品| 亚洲欧洲日本精品| 一区二区国产精品视频| 老色鬼精品视频在线观看播放| 国产小视频免费在线网址| 91成人福利在线| av中文字幕不卡| 久草在线资源福利站| 精品日本一区二区三区| 精品久久久久久久久久久久久久 | 国内成人自拍| 亚洲激情在线观看视频| 久久精品99无色码中文字幕| 麻豆成人综合网| 黄色的网站在线观看| 666精品在线| 亚洲va韩国va欧美va精品| 天天躁日日躁狠狠躁欧美| 久久午夜夜伦鲁鲁一区二区| 日韩一区二区av| 成人免费视频caoporn| 午夜欧美巨大性欧美巨大| 日韩视频一二三| 亚洲第一黄色网| 久久精品国产99久久6| 波多野结衣精品| 亚洲欧洲一区二区在线观看| 亚洲成年人在线播放| 蜜臀久久99精品久久久画质超高清| 四虎影视成人| 亚洲免费视频播放| 日韩电影中文字幕在线| 国产精品综合一区二区| 91福利精品在线观看| 国产免费成人在线| 国产传媒欧美日韩成人精品大片| 日韩一级免费片| 97在线视频国产| 亚洲美女视频在线观看| 日韩影院二区| 国产大片在线免费观看| 日本午夜一区二区三区| 亚洲精品国产电影| 国产 欧美在线| 久久天堂久久| 超清福利视频| 成人欧美一区二区三区在线| 欧美在线三级电影| 亚洲免费网站| 午夜免费福利小电影| 中文字幕亚洲欧美日韩高清| 26uuu亚洲| 亚洲人成精品久久久 | 麻豆久久一区二区| 国产精品亚洲d| 久久久久久久久久久久久久国产| 91精品国产91久久久久| 福利一区福利二区微拍刺激| 在线综合亚洲| www.26天天久久天堂| 亚洲 欧美 另类人妖| 成人午夜两性视频| 91精品欧美综合在线观看最新| 狠狠色综合色综合网络| 涩涩屋成人免费视频软件| 老司机性视频| 精品国产aⅴ麻豆| 精品免费国产一区二区三区四区| 久久99精品一区二区三区| 亚洲色图综合| 中文在线www| 亚洲欧美日韩不卡一区二区三区| 欧美日韩不卡合集视频| 欧美色播在线播放| 极品尤物av久久免费看| 里番精品3d一二三区| 永久免费在线观看视频| 日韩亚洲欧美视频| 国产精品极品美女在线观看免费| 欧美二区三区91| 国产成人综合在线观看| 亚洲a级精品| 久久精品五月婷婷| 久久亚洲精品成人| 国产69精品久久久久777| 午夜久久久久久久久| 欧美在线观看一区二区| 在线日韩一区二区| 亚洲天堂精品在线| 亚洲高清色综合| 国产欧美日韩免费观看| 在线精品国精品国产尤物884a| 1000部国产精品成人观看| 国产欧美日韩麻豆91| 亚洲国产视频一区二区| 日本韩国一区二区| 日韩欧美一级在线播放| 欧美精品成人在线| 国产成人精品在线观看| 不卡免费追剧大全电视剧网站| 精品剧情v国产在线观看在线| 日韩在线视频免费观看| 欧美第一黄色网| 亚洲aⅴ男人的天堂在线观看 | 黄网站免费久久| 天堂99x99es久久精品免费| 国模私拍一区二区国模曼安| 午夜激情影院| 999一区二区三区| 国产精品一区二区不卡视频| 久久久久久国产精品三级玉女聊斋| 亚洲国产天堂网精品网站| 狠狠色狠色综合曰曰| 91蜜桃传媒精品久久久一区二区| 久久精品主播| 欧美丰满日韩| 美女av一区| 亚洲不卡系列| 欧美性videos| 大地资源高清播放在线观看| 奇米精品一区二区三区| 翔田千里亚洲一二三区| 91亚洲精品久久久| 8090成年在线看片午夜| 久久精品91久久久久久再现| 日韩二区三区在线| 欧美日韩国产一级片| 亚洲综合成人在线| 久久日韩粉嫩一区二区三区 | 国产麻豆成人传媒免费观看| 亚洲一卡久久| 国产精品88久久久久久| 成人激情自拍| 成人黄色图片网站| 99爱在线观看| 国产黄色大片在线观看| 免费大片黄在线观看视频网站| 日韩私人影院| 宅男深夜免费观看视频| 美女xx视频| 日日躁夜夜躁aaaabbbb| 国产精品wwwww| 成人免费毛片播放| 97av视频在线观看| 午夜精品久久久久久久无码| www.成年人视频| 国产真人做爰毛片视频直播| 丰满放荡岳乱妇91ww| 成人免费网站在线看| aa成人免费视频| 亚洲精品日韩久久久| 日韩欧美国产不卡| 欧美精品在线观看播放| 黑人巨大精品欧美一区二区三区| 亚洲一二三四区不卡| 亚洲综合色婷婷| 亚洲成人手机在线| 亚洲aⅴ怡春院| 欧美性猛交xxxx免费看| 91福利区一区二区三区|