Go有序map:orderedmap

有序映射

与传统的无序映射(Map)不同,orderedmap包中的有序映射(OrderedMap)可以记录键值对的插入顺序。orderedmap提供了一些有用的API,用来存储、删除、查询和遍历键值对。

获取OrderedMap

你可以通过OrderedMap在github上的地址来访问OrderedMap。或者通过下面的方式手动获取:

git clone https://github.com/liushuochen/orderedmap.git

API

创建一个有序映射实例

使用orderedmap.New函数来创建一个有序映射实例:

package main

import (
    "fmt"
    "github.com/liushuochen/orderedmap"
)

func main() {
    o := orderedmap.New()
    fmt.Printf("%T", o)
    // output: *orderedmap.OrderedMap
}

存储数据

使用OrderedMap实例的Store方法来存储一个数据。OrderedMap依据数据的插入顺序来存放数据。Store方法接收两个interface{}类型的参数key和value,分别表示有序映射的键和值。

下面是Store方法的签名:

func (om *OrderedMap) Store(key, value interface{})

package main

import (
    "fmt"
    "github.com/liushuochen/orderedmap"
)

func main() {
    o := orderedmap.New()
    o.Store("name", "Pizza")
    o.Store("price", 50)
    o.Store("size", "10#")
    fmt.Println(o)
    // output: {name: Piza price: 50 size: 10#}
}

读取数据

使用OrderedMap实例的Load方法来获取某个key对应的value。如果指定的key在映射中不存在,Load方法返回一个nil和一个标记false。下面是Load方法的签名:

func (om *OrderedMap) Load(key interface{}) (interface{}, bool)

对于存在的key,Load方法返回映射中key对应的value和一个标记为true的bool值:

package main

import (
    "fmt"
    "github.com/liushuochen/orderedmap"
)

func main() {
    o := orderedmap.New()
    o.Store("name", "Pizza")
    o.Store("price", 50)
    o.Store("size", "10#")

    size, ok := o.Load("size")
    fmt.Println(size, ok)
    // output: 10# true

    color, ok := o.Load("color")
    fmt.Println(color, ok)
    // output: <nil> false
}

删除数据

使用OrderedMap实例的Delete方法来删除指定的键值对。如果指定要删除的key在Map中不存在,Delete方法不会做任何事。Delete方法会线性的查找要删除的Key,因此时间复杂度是

func (om *OrderedMap) Delete(key interface{})

下面是代码示例:

package main

import (
    "fmt"
    "github.com/liushuochen/orderedmap"
)


func main() {
    o := orderedmap.New()
    o.Store("name", "Pizza")
    o.Store("price", 50)
    o.Store("size", "10#")
    fmt.Println("Before using delete method, the content of orderedmap is: ", o)
    // Before using delete method, the content of orderedmap is:  {name: Pizza price: 50 size: 10#}

    o.Delete("size")
    fmt.Println("After using delete method, the content of orderedmap is: ", o)
    // After using delete method, the content of orderedmap is:  {name: Pizza price: 50}
}

遍历

Range方法可以遍历OrderedMap的每一个键值对(但不能遍历嵌套的结构)。Range方法的参数是一个函数f:

f func(key, value interface{}) bool

如果函数f的返回结果为false,那么遍历终止。

Range方法的签名如下:

func (om *OrderedMap) Range(f func(key, value interface{}) bool)

下面的例子演示了遍历OrderedMap中的每一个键值对,并将Key和Value打印:

package main

import (
    "fmt"
    "github.com/liushuochen/orderedmap"
)

func main() {
    o := orderedmap.New()
    o.Store("A", "a")
    o.Store("B", "b")

    f := func(key, value interface{}) bool {
        fmt.Printf("key: %v, value: %v\n", key, value)
        return true
    }

    o.Range(f)
    // outputs:
    // key: A, value: a
    // key: B, value: b
}

获取长度

使用Length方法来获取OrderedMap实例的长度,即键值对数量(不包含嵌套的键值对)。

func (om *OrderedMap) Length() int

下面的例子是在给OrderedMap实例添加了两个元素后,然后计算其长度:

package main

import (
    "fmt"
    "github.com/liushuochen/orderedmap"
)

func main() {
    o := orderedmap.New()
    o.Store("A", "a")
    o.Store("B", "b")

    fmt.Println(o.Length())
    // output: 2
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值