<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
文章比較硬核,爆肝2千多字,除了hashmap、listmap、treemap使用技巧閱讀還有使用gmap的踩坑之旅,閱讀大約需要5~10分鐘。
一圖勝千言:
範例化範例:
hashMap := gmap.New(true) listMap := gmap.NewListMap(true) treeMap := gmap.NewTreeMap(gutil.ComparatorInt, true)
當我們對返回順序有要求時不能使用hashmap,因為hashmap返回的是無序列表;
當需要按輸入順序返回結果時使用listmap;
當需要讓返回結果自然升序排列時使用treemap
package main import ( "fmt" "github.com/gogf/gf/container/gmap" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/util/gutil" ) func main() { array := g.Slice{5, 1, 2, 7, 3, 9, 0} hashMap := gmap.New(true) listMap := gmap.NewListMap(true) treeMap := gmap.NewTreeMap(gutil.ComparatorInt, true) // 賦值 for _, v := range array { hashMap.Set(v, v) listMap.Set(v, v) treeMap.Set(v, v) } //列印結果 fmt.Println("hashMap.Keys() :", hashMap.Keys()) fmt.Println("hashMap.Values():", hashMap.Values()) //從列印結果可知hashmap的鍵列表和值列表返回值的順序沒有規律,隨機返回 fmt.Println("listMap.Keys() :", listMap.Keys()) fmt.Println("listMap.Values():", listMap.Values()) //listmap鍵列表和值列表有序返回,且順序和寫入順序一致 fmt.Println("treeMap.Keys() :", treeMap.Keys()) fmt.Println("treeMap.Values():", treeMap.Values()) //treemap鍵列表和值列表也有序返回,但是不和寫入順序一致,按自然數升序返回 }
列印結果
hashMap.Keys() : [5 1 2 7 3 9 0] hashMap.Values(): [2 7 3 9 0 5 1] listMap.Keys() : [5 1 2 7 3 9 0] listMap.Values(): [5 1 2 7 3 9 0] treeMap.Keys() : [0 1 2 3 5 7 9] treeMap.Values(): [0 1 2 3 5 7 9]
為了讓大家更好的理解gmap,下面介紹一下gmap的基礎使用和一些進階技巧。
GoFrame框架(下文簡稱gf)提供的資料型別,比如:字典gmap、陣列garray、集合gset、佇列gqueue、樹形結構gtree、連結串列glist都是支援設定並行安全開關的。
支援設定並行安全開關這也是gf提供的常用資料型別和原生資料型別非常重要的區別
今天和大家分享gf框架中gmap相關知識點
go語言提供的原生map不是並行安全的map型別
go語言從1.9版本開始引入了並行安全的sync.Map,但gmap比較於標準庫的sync.Map效能更加優異,並且功能更加豐富。
為了方便大家更好的檢視效果,在下方程式碼段中標明瞭列印結果
package main import ( "fmt" "github.com/gogf/gf/container/gmap" ) func main() { m := gmap.New(true) // 設定鍵值對 for i := 0; i < 10; i++ { m.Set(i, i) } fmt.Println("查詢map大小:", m.Size()) //批次設定鍵值對 m.Sets(map[interface{}]interface{}{ 10: 10, 11: 11, }) // 目前map的值 fmt.Println("目前map的值:", m) fmt.Println("查詢是否存在鍵值對:", m.Contains(1)) fmt.Println("根據key獲得value:", m.Get(1)) fmt.Println("刪除資料", m.Remove(1)) //刪除多組資料 fmt.Println("刪除前的map大小:", m.Size()) m.Removes([]interface{}{2, 3}) fmt.Println("刪除後的map大小:", m.Size()) //當前鍵名列表 fmt.Println("鍵名列表:", m.Keys()) //我們發現是無序列表 fmt.Println("鍵值列表:", m.Values()) //我們發現也是無序列表 //查詢鍵名,當鍵值不存在時寫入預設值 fmt.Println(m.GetOrSet(20, 20)) //返回值是20 fmt.Println(m.GetOrSet(20, "二十")) //返回值仍然是20,因為key對應的值存在 m.Remove(20) fmt.Println(m.GetOrSet(20, "二十")) //返回值是二十,因為key對應的值不存在 // 遍歷map m.Iterator(func(k interface{}, v interface{}) bool { fmt.Printf("%v:%v n", k, v) return true }) //自定義寫鎖操作 m.LockFunc(func(m map[interface{}]interface{}) { m[88] = 88 }) // 自定義讀鎖操作 m.RLockFunc(func(m map[interface{}]interface{}) { fmt.Println("m[88]:", m[88]) }) // 清空map m.Clear() //判斷map是否為空 fmt.Println("m.IsEmpty():", m.IsEmpty()) }
執行結果
上面介紹的基礎使用比較簡單,下面介紹進階使用。
注意:Merge()的引數需要是map的參照型別,也就是傳map的取址符。
package main import ( "fmt" "github.com/gogf/gf/container/gmap" ) func main() { var m1, m2 gmap.Map m1.Set("k1", "v1") m2.Set("k2", "v2") m1.Merge(&m2) fmt.Println("m1.Map()", m1.Map()) //m1.Map() map[k1:v1 k2:v2] fmt.Println("m2.Map()", m2.Map()) //m2.Map() map[k2:v2] }
正如上一篇 GoFrame glist 基礎使用和自定義遍歷 介紹的,gf框架提供的資料型別不僅支援設定並行安全,也都支援序列化和反序列化。
json序列化和反序列化:序列化就是轉成json格式,反序列化就是json轉成其他格式型別(比如:map、陣列、物件等)
package main import ( "encoding/json" "fmt" "github.com/gogf/gf/container/gmap" ) func main() { // 序列化 //var m gmap.Map m := gmap.New() //必須範例化 只是像上面宣告但是不進行範例化,是無法序列化成功的 m.Sets(map[interface{}]interface{}{ "name": "王中陽", "age": 28, }) res, _ := json.Marshal(m) fmt.Println("序列化結果:", res) //列印結果:{"age":28,"name":"王中陽"} // 反序列化 m2 := gmap.New() s := []byte(`{"age":28,"name":"王中陽"}`) _ = json.Unmarshal(s, &m2) fmt.Println("反序列化結果:", m2.Map()) //反序列化結果: map[age:28 name:王中陽] }
踩坑
正如上面程式碼段中註釋提到的:
在進行序列化操作時,必須範例化map
m := gmap.New()
只是宣告map而不進行範例化,是無法序列化成功的
var m gmap.Map
package main import ( "fmt" "github.com/gogf/gf/container/gmap" ) func main() { //首先明確:空值和nil是不一樣的,nil是未定義;而空值包括空字串,false、0等 m1 := gmap.NewFrom(map[interface{}]interface{}{ "k1": "", "k2": nil, "k3": 0, "k4": false, "k5": 1, }) m2 := gmap.NewFrom(map[interface{}]interface{}{ "k1": "", "k2": nil, "k3": 0, "k4": false, "k5": 1, }) m1.FilterEmpty() m2.FilterNil() fmt.Println("m1.FilterEmpty():", m1) //預測結果: k5:1 fmt.Println("m2.FilterNil():", m2) //預測結果:除了k2,其他都返回 // 列印結果和預期的一致: //m1.FilterEmpty(): {"k5":1} //m2.FilterNil(): {"k1":"","k3":0,"k4":false,"k5":1} }
列印結果
m1.FilterEmpty(): {"k5":1} m2.FilterNil(): {"k1":"","k3":0,"k4":false,"k5":1}
package main import ( "github.com/gogf/gf/container/gmap" "github.com/gogf/gf/frame/g" ) func main() { // 鍵值對反轉flip var m gmap.Map m.Sets(map[interface{}]interface{}{ "k1": "v1", "k2": "v2", }) fmt.Println("反轉前:", m.Map()) m.Flip() fmt.Println("反轉後:", m.Map()) }
列印結果
反轉前:{ "k1": "v1", "k2": "v2" } 反轉後:{ "v1": "k1", "v2": "k2" }
package main import ( "fmt" "github.com/gogf/gf/container/gmap" ) func main() { //pop pops map出棧(彈棧) var m gmap.Map m.Sets(map[interface{}]interface{}{ 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, }) fmt.Println("m.Pop()之前:", m.Map()) key, value := m.Pop() fmt.Println("key:", key) fmt.Println("value:", value) fmt.Println("m.Pop()之後:", m.Map()) //多次測試後發現是隨機出棧,不能理所當然的認為按順序出棧 res := m.Pops(2) //引數是出棧個數 fmt.Println("res:", res) fmt.Println("m.Pops之後:", m.Map()) //多次測試之後發現也是隨機出棧 }
執行結果
踩坑
注意:多次測試後發現是隨機出棧,不能理所當然的認為按順序出棧
通過這篇文章,我們瞭解到:
重點消化一下map遍歷時,不同map的特點:
gmap的基礎使用和進階使用技巧:反轉map、序列化、合併map、出棧等。
gf框架提供的資料結構,比如:字典gmap、陣列garray、集合gset、佇列gqueue、樹形結構gtree、連結串列glist 都是支援設定並行安全開關的;而且都支援序列化和反序列化,實現了標準庫json
資料格式的序列化/反序列化介面。
以上就是GoFrame gmap遍歷hashmap listmap treemap使用技巧的詳細內容,更多關於GoFrame gmap遍歷的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45