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

Go 中 Set 的實(shí)現(xiàn)方案,你會(huì)嗎?

網(wǎng)絡(luò) 通信技術(shù)
Go 的設(shè)計(jì)是一種簡單哲學(xué),它摒棄了其他語言一些臃腫的功能和模塊,以降低程序員的學(xué)習(xí)門檻,減少使用中的心智負(fù)擔(dān)。

Go 的設(shè)計(jì)是一種簡單哲學(xué),[[423390]]

它摒棄了其他語言一些臃腫的功能和模塊,以降低程序員的學(xué)習(xí)門檻,減少使用中的心智負(fù)擔(dān)。

本文,我們來探討 Go 中缺失的數(shù)據(jù)結(jié)構(gòu):Set,以及它的最佳實(shí)現(xiàn)方案。

Set 語義與實(shí)現(xiàn)方案

Set 集合是其他語言中常見的數(shù)據(jù)結(jié)構(gòu)。特性:集合中的對(duì)象不按特定的方式排序,并且沒有重復(fù)對(duì)象。

學(xué)習(xí) Go ,要記住:Go 沒有包含的東西,不代表 Go 真的沒有。根據(jù) Set 特性,我們可以很輕松地想到使用 map 的實(shí)現(xiàn)方案(因?yàn)?map 的 key 是不重復(fù)的):把對(duì)象當(dāng)做 key 存入 map。

使用 map 來實(shí)現(xiàn) Set,意味著我們只關(guān)心 key 的存在,其 value 值并不重要。有其他語言編程經(jīng)驗(yàn)的人也許會(huì)選擇 bool 來作為 value,因?yàn)樗瞧渌Z言中內(nèi)存消耗最少的類型(1個(gè)字節(jié))。但是在 Go 中,還有另一種選擇:struct{}。

  1. fmt.Println(unsafe.Sizeof(struct {}{})) // output: 0 

壓測(cè)對(duì)比

為了探究哪種數(shù)據(jù)結(jié)構(gòu)是作為 value 的最佳選擇。我們選擇了以下常用的類型作為 value 進(jìn)行測(cè)試:bool、int、interface{}、struct{}。

  1. package main 
  2.  
  3. import ( 
  4.  "testing" 
  5.  
  6. const num = int(1 << 24) 
  7.  
  8. // 測(cè)試 bool 類型 
  9. func Benchmark_SetWithBoolValueWrite(b *testing.B) { 
  10.  set := make(map[int]bool) 
  11.  for i := 0; i < num; i++ { 
  12.   set[i] = true 
  13.  } 
  14.  
  15. // 測(cè)試 interface{} 類型 
  16. func Benchmark_SetWithInterfaceValueWrite(b *testing.B) { 
  17.  set := make(map[int]interface{}) 
  18.  for i := 0; i < num; i++ { 
  19.   set[i] = struct{}{} 
  20.  } 
  21.  
  22. // 測(cè)試 int 類型 
  23. func Benchmark_SetWithIntValueWrite(b *testing.B) { 
  24.  set := make(map[int]int
  25.  for i := 0; i < num; i++ { 
  26.   set[i] = 0 
  27.  } 
  28.  
  29. // 測(cè)試 struct{} 類型 
  30. func Benchmark_SetWithStructValueWrite(b *testing.B) { 
  31.  set := make(map[int]struct{}) 
  32.  for i := 0; i < num; i++ { 
  33.   set[i] = struct{}{} 
  34.  } 

我們運(yùn)行以下命令,進(jìn)行測(cè)試

  1. $ go test -v -bench=. -count=3 -benchmem | tee result.txt 
  2. goos: darwin 
  3. goarch: amd64 
  4. pkg: workspace/example/demoForSet 
  5. cpu: Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz 
  6. Benchmark_SetWithBoolValueWrite 
  7. Benchmark_SetWithBoolValueWrite-8                1 3549312568 ns/op 883610264 B/op   614311 allocs/op 
  8. Benchmark_SetWithBoolValueWrite-8                1 3288521519 ns/op 883599440 B/op   614206 allocs/op 
  9. Benchmark_SetWithBoolValueWrite-8                1 3264097496 ns/op 883578624 B/op   614003 allocs/op 
  10. Benchmark_SetWithInterfaceValueWrite 
  11. Benchmark_SetWithInterfaceValueWrite-8           1 4397757645 ns/op 1981619632 B/op   614062 allocs/op 
  12. Benchmark_SetWithInterfaceValueWrite-8           1 4088301215 ns/op 1981553392 B/op   613743 allocs/op 
  13. Benchmark_SetWithInterfaceValueWrite-8           1 3990698218 ns/op 1981560880 B/op   613773 allocs/op 
  14. Benchmark_SetWithIntValueWrite 
  15. Benchmark_SetWithIntValueWrite-8                 1 3472910194 ns/op 1412326480 B/op   615131 allocs/op 
  16. Benchmark_SetWithIntValueWrite-8                 1 3519755137 ns/op 1412187928 B/op   614294 allocs/op 
  17. Benchmark_SetWithIntValueWrite-8                 1 3459182691 ns/op 1412057672 B/op   613390 allocs/op 
  18. Benchmark_SetWithStructValueWrite 
  19. Benchmark_SetWithStructValueWrite-8              1 3126746088 ns/op 802452368 B/op   614127 allocs/op 
  20. Benchmark_SetWithStructValueWrite-8              1 3161650835 ns/op 802431240 B/op   613632 allocs/op 
  21. Benchmark_SetWithStructValueWrite-8              1 3160410871 ns/op 802440552 B/op   613748 allocs/op 
  22. PASS 
  23. ok   workspace/example/demoForSet 42.660s 

此時(shí)的結(jié)果看起來不太直觀,這里推薦一個(gè) benchmark 統(tǒng)計(jì)工具:Benchstat。通過以下命令進(jìn)行安裝

  1. $ go get -u golang.org/x/perf/cmd/benchstat 

使用 benchstat 分析剛才得到的 benchmark 結(jié)果文件

  1. $ benchstat result.txt 
  2. name                           time/op 
  3. _SetWithBoolValueWrite-8        3.37s ± 5% 
  4. _SetWithInterfaceValueWrite-8   4.16s ± 6% 
  5. _SetWithIntValueWrite-8         3.48s ± 1% 
  6. _SetWithStructValueWrite-8      3.15s ± 1% 
  7.  
  8. name                           alloc/op 
  9. _SetWithBoolValueWrite-8        884MB ± 0% 
  10. _SetWithInterfaceValueWrite-8  1.98GB ± 0% 
  11. _SetWithIntValueWrite-8        1.41GB ± 0% 
  12. _SetWithStructValueWrite-8      802MB ± 0% 
  13.  
  14. name                           allocs/op 
  15. _SetWithBoolValueWrite-8         614k ± 0% 
  16. _SetWithInterfaceValueWrite-8    614k ± 0% 
  17. _SetWithIntValueWrite-8          614k ± 0% 
  18. _SetWithStructValueWrite-8       614k ± 0% 

從內(nèi)存開銷而言,struct{} 是最小的,反映在執(zhí)行時(shí)間上也是最少的。由于 bool 類型僅占一個(gè)字節(jié),它相較于空結(jié)構(gòu)而言,相差的并不多。但是,如果使用 interface{} 類型,那差距就很明顯了。

所以,毫無疑問,在 Set 的實(shí)現(xiàn)中, map 值類型應(yīng)該選 struct{}。

總結(jié)

本文雖然討論的是 Set 的實(shí)現(xiàn)方案,但本質(zhì)是涉及空結(jié)構(gòu)體 struct{}{} 的 零內(nèi)存特性。

空結(jié)構(gòu)體除了是實(shí)現(xiàn) Set 的 value 值最佳方案,它還可以應(yīng)用于以下方面:

 

  • 通知信號(hào)的 channel:當(dāng) channel 只用于通知 goroutine 的執(zhí)行事件,此時(shí) channel 就不需要發(fā)送任何實(shí)質(zhì)性的數(shù)據(jù),選擇使用 chan struct{} 。
  • 沒有狀態(tài)數(shù)據(jù)的結(jié)構(gòu)體:當(dāng)對(duì)象只擁有方法,而不包含任何的屬性字段時(shí),選擇使用空結(jié)構(gòu)體定義該對(duì)象。

 

責(zé)任編輯:武曉燕 來源: Golang技術(shù)分享
相關(guān)推薦

2021-11-05 10:59:06

元編程語言工具

2022-03-15 08:36:46

遞歸查詢SQL

2021-10-27 10:55:18

Go入門Demo

2022-03-01 07:52:38

鏈表指針節(jié)點(diǎn)

2019-05-07 15:49:27

AI人工智能藝術(shù)

2025-01-10 10:44:52

2010-07-13 10:40:30

唐駿

2022-10-24 09:57:02

runeGo語言

2021-08-19 15:36:09

數(shù)據(jù)備份存儲(chǔ)備份策略

2021-03-15 06:49:03

Ffmpeg項(xiàng)目轉(zhuǎn)換庫

2024-03-29 12:50:00

項(xiàng)目分層模型

2021-11-10 15:37:49

Go源碼指令

2021-04-16 15:02:11

CAP理論分布式

2021-04-14 06:53:52

C# 修飾符 Public

2021-02-15 14:48:31

Hive語法sql

2024-02-22 08:31:26

數(shù)據(jù)恢復(fù)工具MySQL回滾SQL

2012-06-20 10:47:25

Team Leader

2024-10-28 08:38:40

會(huì)員批量應(yīng)用

2023-02-27 10:45:16

2012-06-20 15:01:25

iOS開發(fā)
點(diǎn)贊
收藏

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

成人羞羞国产免费| 亚洲午夜精品一区二区| 欧美a在线视频| 久久久久久免费毛片精品| 日韩电影在线观看完整版| 欧美日韩国产免费一区二区| 久久精品女人| 亚洲免费观看高清完整版在线| 你懂的视频一区二区| 欧洲色大大久久| 免费精品视频在线| 欧美性做爰毛片| 亚洲精品大片| 精品视频在线免费观看| 2020色愉拍亚洲偷自拍| 青娱乐一区二区| 国产一二三区在线| 久久不射网站| 欧美激情亚洲综合一区| 亚洲第一视频| 在线观看免费视频高清游戏推荐| 久久婷婷国产| 国产亚洲欧美色| 成人激情春色网| 中文字幕电影在线| 国产ts人妖一区二区三区| 久久精品日产第一区二区三区精品版 | 久久国产精品久久精品国产| 国产高清自产拍av在线| a亚洲天堂av| 久久免费看少妇高潮| 久久久国产视频| 6699嫩草久久久精品影院| 国产精品福利在线观看网址| 顶级网黄在线播放| 最新日韩av| 欧美一区二区三区四区在线观看地址| 国内自拍视频一区二区三区| 精品欧美一区二区在线观看视频 | 最近中文字幕免费mv2018在线| 成人h动漫精品一区二| 日本欧美爱爱爱| 国产探花一区二区| 91精品国产一区二区| 精品捆绑调教一区二区三区| 亚洲成人a级片| 水蜜桃在线免费观看| 精品一区二区精品| 亚洲免费一级视频| 91美女视频网站| 台湾佬中文娱乐久久久| 精品国产依人香蕉在线精品| 超碰成人在线免费| 亚洲一区二区三区爽爽爽爽爽| 免费看污久久久| 国产精品亚洲午夜一区二区三区| 妞干网在线免费视频| 精品免费在线视频| 成人毛片一区二区| 一区二区三区资源| 国产福利在线播放麻豆| 日韩在线观看视频免费| av在线播放免费| 国产一区二区三区在线观看网站 | 一区二区三区国产视频| 欧美一区自拍| 免费观看国产成人| 2023国产一二三区日本精品2022| 在线免费国产视频| 亚洲永久一区二区三区在线| 国产精品videossex久久发布| 国产小视频国产精品| a黄色片在线观看| 7777精品伊人久久久大香线蕉超级流畅| 欧美午夜片在线免费观看| 日本fc2在线观看| 人人澡人一摸人人添| 黄色视屏免费在线观看| 精品二区三区线观看| 一区二区三区视频观看| 永久免费av在线| 亚洲美女网站| 99热在线播放| 91成人精品| 欧美激情综合色| 亚洲性受xxx喷奶水| 欧美亚洲免费在线一区| 国产盗摄一区二区| 亚洲精选在线观看| 黄色99视频| 国产婷婷精品| 91久久香蕉国产日韩欧美9色| 日本高清中文字幕在线| 亚洲视频在线播放| 男女av免费观看| 欧美视频精品一区| 一区视频网站| 国产成人精品一区二区三区四区| 6080yy午夜一二三区久久| 国产精品迅雷| 999在线免费视频| 亚洲日本中文字幕| 可以在线观看的黄色| 亚洲精品国产第一综合99久久 | 成人精品国产| 国产精品久久久久av| 国产亚洲自拍一区| 阿v视频在线观看| 国产一区二区久久久| 成人av免费| 日本久久91av| 久久亚洲二区三区| 2001个疯子在线观看| 欧美激情视频一区二区三区| 欧美美女喷水视频| 天堂中文字幕| 国产一区二区三区欧美| 国产在线观看免费一区| 黄网址在线观看| 蜜桃视频一区二区在线观看| 亚洲片在线资源| 26uuu国产一区二区三区| 日韩av黄色| 午夜视频在线免费| 欧美乱大交xxxxx另类电影| 久久93精品国产91久久综合| 国产伦一区二区三区色一情| 欧美国产一区在线| 国产精品99久久| 北岛玲精品视频在线观看| 理论片一区二区在线| 午夜精品毛片| 91精品国产一区二区三密臀| 2019亚洲日韩新视频| 国产精品天美传媒沈樵| 国产中文欧美日韩在线| 亚洲精品wwww| 亚洲天天在线日亚洲洲精| 成人一区二区在线观看| 岳毛多又紧做起爽| 亚洲人精选亚洲人成在线| 国产欧美日韩亚州综合| 久久综合av| 亚洲精品成人图区| 欧美一区日韩一区| 日韩va欧美va亚洲va久久| 蜜桃麻豆av在线| 最近2018年手机中文在线| av免费观看大全| 91免费看国产| 欧美大片在线看| 亚洲精品第一国产综合精品| 一区二区三区欧美| 午夜精品一区| 国产精品videossex国产高清| 奇米4444一区二区三区| 欧美高清你懂得| 欧美zozo另类异族| 五月婷婷丁香综合网| 久久综合五月天| 欧美一区日韩一区| 欧美精品日韩综合在线| 高清一区二区三区日本久| 天堂社区 天堂综合网 天堂资源最新版| 日本一级淫片演员| 亚洲欧美国产一区二区| 国产成人一区二区三区别| 99精品视频在线看| 99热自拍偷拍| 国产一区二区三区视频在线观看| 精品国产人成亚洲区| 一区二区三区精品久久久| 久久婷婷av| 午夜精品影院| 亚洲欧美偷拍自拍| 国产视频一区二区在线播放| 中文在线а√在线| 亚洲一区二区蜜桃| 日韩精品不卡| 久久精品国产一区二区三区日韩 | 亚洲日韩欧美一区二区在线| 亚洲最大成人在线观看| 成人在线免费网站| 51精品在线观看| 日韩视频免费在线观看| 亚洲韩国欧洲国产日产av| 午夜精品久久久久久久久久| 亚洲色图在线视频| 极品美女销魂一区二区三区| 中日韩视频在线观看| www.欧美| www.一区| 国产精品视频一区二区三区综合| 日本综合字幕| 丁香花在线影院| 三级中文字幕在线观看| 一区二区三区短视频| 成人av在线播放| 不卡精品视频| 欧美日韩黑人|