GoFrame gmap-基本使用

2022-04-08 09:41 更新

并發(fā)安全

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

m := gmap.New(true)

不僅僅是?gmap?模塊,?goframe?框架的其他并發(fā)安全數(shù)據(jù)結(jié)構(gòu)也支持并發(fā)安全特性開(kāi)關(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ù)開(kāi)啟并發(fā)安全特性。
    m := gmap.New()

    // 設(shè)置鍵值對(duì)
    for i := 0; i < 10; i++ {
        m.Set(i, i)
    }
    // 查詢(xún)大小
    fmt.Println(m.Size())
    // 批量設(shè)置鍵值對(duì)(不同的數(shù)據(jù)類(lèi)型對(duì)象參數(shù)不同)
    m.Sets(map[interface{}]interface{}{
        10 : 10,
        11 : 11,
    })
    fmt.Println(m.Size())

    // 查詢(xún)是否存在
    fmt.Println(m.Contains(1))

    // 查詢(xún)鍵值
    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())

    // 查詢(xún)鍵名,當(dāng)鍵值不存在時(shí),寫(xiě)入給定的默認(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
    })

    // 自定義寫(xiě)鎖操作
    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

有序遍歷

我們來(lái)看一下三種不同類(lèi)型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空值過(guò)濾

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*判斷性寫(xiě)入

判斷性寫(xiě)入是指當(dāng)指定的鍵名不存在時(shí)則寫(xiě)入并且方法返回?true?,否則忽略寫(xiě)入并且方法返回?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?模塊下的所有容器類(lèi)型均實(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]


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)