有序映射
与传统的无序映射(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
}