Skip to content

Latest commit

 

History

History
139 lines (105 loc) · 3.92 KB

README_cn.md

File metadata and controls

139 lines (105 loc) · 3.92 KB

OrderedMap

英文版: English

概要

OrderedMap是一个能够保持键(key)顺序的map。

特点

  • 简单
  • 快速(使用json.Decoder来反序列化)
  • 强大的API
  • 完备的文档
  • 序列化/反序列化支持

使用

package main

import (
    "fmt"
    "encoding/json"
    "github.com/haifenghuang/orderedmap"
)

func main() {
    om := orderedmap.New()
    om.Set("Name", "HuangHaiFeng")
    om.Set("Sex", "Male")
    om.Set("Hobby", "Programming")
    om.Set("Country", "China")

    hobby, _ := om.Get("Hobby")
    fmt.Printf("Hobby = %s\n", hobby)

    sex, _ := om.GetAt(1)
    fmt.Printf("sex = %v\n", sex)

    om.SetAt(2, "Married", true)
    married, _ := om.GetAt(2)
    fmt.Printf("married = %t\n", married)

    fmt.Printf("=============================\n")
    fmt.Printf("keys = %v\n", om.Keys())
    fmt.Printf("values = %v\n", om.Values())
    fmt.Printf("mapLen = %d\n", om.Len())

    fmt.Printf("=============================\n")
    om.DeleteAt(2)
    fmt.Printf("OrderedMap = %s\n", om)

    fmt.Printf("=============================\n")
    has := om.Exists("Married")
    fmt.Printf("Married? - %t\n", has)
    has = om.Exists("Country")
    fmt.Printf("Country? - %t\n", has)

    fmt.Printf("=============================\n")
    idx := om.Index("Hobby")
    fmt.Printf("Hobby key's index = %d\n", idx)

    fmt.Printf("=============================\n")
    b, _ := json.MarshalIndent(om, "", "    ")
    fmt.Printf("Marshal result = %s\n", string(b))

    fmt.Printf("=============================\n")
    jsonStream := `{
    "Name": "HuangHaiFeng",
    "Sex": "Male",
    "Hobby": "Programming",
    "Country": "China"
}`
    om2 := orderedmap.New()
    _ = json.Unmarshal([]byte(jsonStream), om2)
    fmt.Printf("om2 = %v\n", om2)

    om2.Sort()
    fmt.Printf("==============================\n")
    fmt.Printf("om2 = %v\n", om2)

    om3 := om2.Reverse()
    fmt.Printf("==============================\n")
    fmt.Printf("om3 = %v\n", om3)

    om4 := om3.Filter(func(key string,value interface{}) bool {
        return key == "China" || key == "Male"
    })
    fmt.Printf("==============================\n")
    fmt.Printf("om4 = %v\n", om4)
}

局限性

  • OrderedMap仅支持字符串类型的键(key)。
  • OrderedMap对于并发访问不是线程安全的。(使用sync.RWMutex来增加并发访问应该比较简单)

API

函数 说明
New() 创建一个新的OrderedMap。
Get(key string) 根据提供的key,返回相应的value。
GetAt(pos int) 根据提供的pos,返回其对应位置的值。
Set(key string, value interface{}) 设置map的key/value。
SetAt(index int, key string, val interface{}) 在指定indx处设置相应的key/value。
Delete(key string) 删除指定key对应的值。
DeleteAt(offset int) 删除指定位置(offset)的key/value元素。
Keys() 返回OrderedMap的所有键(key)。
Values() 返回OrderedMap的所有值(value)。
Exists(key string) 测试key是否存在于OrderedMap中。
Index(key string) 返回key所对应的值(value)处的索引。
Len() 返回OrderedMap的长度。
String() 返回JSON序列化后的字符串。
Reverse() Reverse reverse key & value of a map. The value must be a string。
Sort() Sort the given OrderedMap。
Filter(f func(key string, value interface{}) bool) Filter an OrderedMap if the provided function return true。
MarshalJSON() ([]byte, error) MarshalJSON 实现了json.Marshaller接口。
UnmarshalJSON(b []byte) error UnmarshalJSON实现了json.Unmarshaller接口。

其它可选项

许可证

MIT

备注

如果你喜欢此项目,请多多star,fork。谢谢!