新聞中心
并發(fā)安全
?gmap?支持并發(fā)安全選項(xiàng)開關(guān),在默認(rèn)情況下是非并發(fā)安全的,開發(fā)者可以選擇開啟?gmap?的并發(fā)安全特性(傳遞初始化開關(guān)參數(shù)?safe?參數(shù)值為?true?, 必須在初始化時(shí)設(shè)定,不能運(yùn)行時(shí)動(dòng)態(tài)設(shè)定)。如:

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺(tái)小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了尉氏免費(fèi)建站歡迎大家使用!
m := gmap.New(true)不僅僅是?gmap?模塊,?GOframe?框架的其他并發(fā)安全數(shù)據(jù)結(jié)構(gòu)也支持并發(fā)安全特性開關(guān)。
使用示例
基本使用
package main
import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
)
func main() {
// 創(chuàng)建一個(gè)默認(rèn)的gmap對(duì)象,
// 默認(rèn)情況下該gmap對(duì)象不支持并發(fā)安全特性,
// 初始化時(shí)可以給定true參數(shù)開啟并發(fā)安全特性。
m := gmap.New()
// 設(shè)置鍵值對(duì)
for i := 0; i < 10; i++ {
m.Set(i, i)
}
// 查詢大小
fmt.Println(m.Size())
// 批量設(shè)置鍵值對(duì)(不同的數(shù)據(jù)類型對(duì)象參數(shù)不同)
m.Sets(map[interface{}]interface{}{
10 : 10,
11 : 11,
})
fmt.Println(m.Size())
// 查詢是否存在
fmt.Println(m.Contains(1))
// 查詢鍵值
fmt.Println(m.Get(1))
// 刪除數(shù)據(jù)項(xiàng)
m.Remove(9)
fmt.Println(m.Size())
// 批量刪除
m.Removes([]interface{}{10, 11})
fmt.Println(m.Size())
// 當(dāng)前鍵名列表(隨機(jī)排序)
fmt.Println(m.Keys())
// 當(dāng)前鍵值列表(隨機(jī)排序)
fmt.Println(m.Values())
// 查詢鍵名,當(dāng)鍵值不存在時(shí),寫入給定的默認(rèn)值
fmt.Println(m.GetOrSet(100, 100))
// 刪除鍵值對(duì),并返回對(duì)應(yīng)的鍵值
fmt.Println(m.Remove(100))
// 遍歷map
m.Iterator(func(k interface{}, v interface{}) bool {
fmt.Printf("%v:%v ", k, v)
return true
})
// 自定義寫鎖操作
m.LockFunc(func(m map[interface{}]interface{}) {
m[99] = 99
})
// 自定義讀鎖操作
m.RLockFunc(func(m map[interface{}]interface{}) {
fmt.Println(m[99])
})
// 清空map
m.Clear()
// 判斷map是否為空
fmt.Println(m.IsEmpty())
}執(zhí)行后,輸出結(jié)果為:
10
12
true
1
11
9
[0 1 2 4 6 7 3 5 8]
[3 5 8 0 1 2 4 6 7]
100
100
3:3 5:5 8:8 7:7 0:0 1:1 2:2 4:4 6:6 99
true
有序遍歷
我們來看一下三種不同類型map的有序性遍歷示例。
package main
import (
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/util/gutil"
)
func main() {
array := g.Slice{2, 3, 1, 5, 4, 6, 8, 7, 9}
hashMap := gmap.New(true)
listMap := gmap.NewListMap(true)
treeMap := gmap.NewTreeMap(gutil.ComparatorInt, true)
for _, v := range array {
hashMap.Set(v, v)
}
for _, v := range array {
listMap.Set(v, v)
}
for _, v := range array {
treeMap.Set(v, v)
}
fmt.Println("HashMap Keys:", hashMap.Keys())
fmt.Println("HashMap Values:", hashMap.Values())
fmt.Println("ListMap Keys:", listMap.Keys())
fmt.Println("ListMap Values:", listMap.Values())
fmt.Println("TreeMap Keys:", treeMap.Keys())
fmt.Println("TreeMap Values:", treeMap.Values())
}執(zhí)行后,輸出結(jié)果為:
HashMap Keys: [4 6 8 7 9 2 3 1 5]
HashMap Values: [6 8 4 3 1 5 7 9 2]
ListMap Keys: [2 3 1 5 4 6 8 7 9]
ListMap Values: [2 3 1 5 4 6 8 7 9]
TreeMap Keys: [1 2 3 4 5 6 7 8 9]
TreeMap Values: [1 2 3 4 5 6 7 8 9]
FilterEmpty/FilterNil空值過濾
package main
import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/frame/g"
)
func main() {
m1 := gmap.NewFrom(g.MapAnyAny{
"k1": "",
"k2": nil,
"k3": 0,
"k4": 1,
})
m2 := gmap.NewFrom(g.MapAnyAny{
"k1": "",
"k2": nil,
"k3": 0,
"k4": 1,
})
m1.FilterEmpty()
m2.FilterNil()
fmt.Println(m1.Map())
fmt.Println(m2.Map())
// Output:
// map[k4:1]
// map[k1: k3:0 k4:1]
}
Flip鍵值對(duì)反轉(zhuǎn)
package main
import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/frame/g"
)
func main() {
var m gmap.Map
m.Sets(g.MapAnyAny{
"k1": "v1",
"k2": "v2",
})
m.Flip()
fmt.Println(m.Map())
// May Output:
// map[v1:k1 v2:k2]
}
Keys/Values鍵名/數(shù)值列表
package main
import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/frame/g"
)
func main() {
var m gmap.Map
m.Sets(g.MapAnyAny{
"k1": "v1",
"k2": "v2",
"k3": "v3",
"k4": "v4",
})
fmt.Println(m.Keys())
fmt.Println(m.Values())
// May Output:
// [k1 k2 k3 k4]
// [v2 v3 v4 v1]
}
Pop/Pops隨機(jī)出棧
package main
import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/frame/g"
)
func main() {
var m gmap.Map
m.Sets(g.MapAnyAny{
"k1": "v1",
"k2": "v2",
"k3": "v3",
"k4": "v4",
})
fmt.Println(m.Pop())
fmt.Println(m.Pops(2))
fmt.Println(m.Size())
// May Output:
// k1 v1
// map[k2:v2 k4:v4]
// 1
}
SetIfNotExist*判斷性寫入
判斷性寫入是指當(dāng)指定的鍵名不存在時(shí)則寫入并且方法返回?true?,否則忽略寫入并且方法返回?false?。相關(guān)方法如下:
- ?
SetIfNotExist? - ?
SetIfNotExistFunc? - ?
SetIfNotExistFuncLock?
方法具體描述請(qǐng)查看接口文檔或源碼注釋。
package main
import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
)
func main() {
var m gmap.Map
fmt.Println(m.SetIfNotExist("k1", "v1"))
fmt.Println(m.SetIfNotExist("k1", "v1"))
fmt.Println(m.Map())
// Output:
// true
// false
// map[k1:v1]
}
Merge字典表合并
package main
import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
)
func main() {
var m1, m2 gmap.Map
m1.Set("key1", "val1")
m2.Set("key2", "val2")
m1.Merge(&m2)
fmt.Println(m1.Map())
// May Output:
// map[key1:val1 key2:val2]
}
JSON序列化/反序列
?gmap?模塊下的所有容器類型均實(shí)現(xiàn)了標(biāo)準(zhǔn)庫(kù)json數(shù)據(jù)格式的序列化/反序列化接口。
1. Marshal
package main
import (
"encoding/json"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/container/gmap"
)
func main() {
m := gmap.New()
m.Sets(g.MapAnyAny{
"name": "john",
"score": 100,
})
b, _ := json.Marshal(m)
fmt.Println(string(b))
}執(zhí)行后,輸出結(jié)果:
{"name":"john","score":100}
2.Unmarshal
package main
import (
"encoding/json"
"fmt"
"github.com/gogf/gf/v2/container/gmap"
)
func main() {
m := gmap.Map{}
s := []byte(`{"name":"john","score":100}`)
json.Unmarshal(s, &m)
fmt.Println(m.Map())
}執(zhí)行后,輸出結(jié)果:
map[name:john score:100] 文章標(biāo)題:創(chuàng)新互聯(lián)GoFrame教程:GoFramegmap-基本使用
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/dpdcshd.html


咨詢
建站咨詢
