Chinese version: 中文
OrderedMap is a map which preserving the key order as they are added to the map.
- Simple
 - Fast(Use 
json.Decoderfor unmarshaling) - Powerful API
 - Well documented
 - Marshaling & UnMarshaling support.
 
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 only takes strings for the key.
 - OrderedMap is not thread-safe for concurrent use.(It is simple enough to add one using sync.RWMutex)
 
| Function | Description | 
|---|---|
| New() | New create a new OrderedMap. | 
| Get(key string) | Get returns the value of the map based on its key. | 
| GetAt(pos int) | GetAt returns the value based on the provided pos. | 
| Set(key string, value interface{}) | Set sets the key/value of the map based on key and value. | 
| SetAt(index int, key string, val interface{}) | SetAt sets the given key to the given value at the specified index. | 
| Delete(key string) | Delete remove an item from the map by the supplied key. | 
| DeleteAt(offset int) | DeleteAt delete the key/value pair from the map by the supplied offset. | 
| Keys() | Keys return the keys of the map in the order they were added. | 
| Values() | Values returns a slice of the values in the order they were added. | 
| Exists(key string) | Exists test whether the key exists or not. | 
| Index(key string) | Index returns the offset of the key in the ordered map. | 
| Len() | Len returns the length of the map. | 
| String() | String returns the JSON serialized string representation. | 
| 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 implements the json.Marshaller interface. |  
| UnmarshalJSON(b []byte) error | UnmarshalJSON implements the json.Unmarshaller interface. |  
-  
cevaris/ordered_map Not support marshaling/unmarshaling.
 -  
iancoleman/orderedmap Unmarshaling is self-written, not using
json.Decoder. 
MIT
If you like this repo,please star & fork. Thanks!