# Maputil Package maputil includes some functions to manipulate map.
## Source: - [https://github.com/duke-git/lancet/blob/main/maputil/map.go](https://github.com/duke-git/lancet/blob/main/maputil/map.go) - [https://github.com/duke-git/lancet/blob/main/maputil/concurrentmap.go](https://github.com/duke-git/lancet/blob/main/maputil/concurrentmap.go) - [https://github.com/duke-git/lancet/blob/main/maputil/orderedmap.go](https://github.com/duke-git/lancet/blob/main/maputil/orderedmap.go)
## Example: ```go import ( "github.com/duke-git/lancet/v2/maputil" ) ```
## Index - [MapTo](#MapTo) - [ForEach](#ForEach) - [Filter](#Filter) - [FilterByKeys](#FilterByKeys) - [FilterByValues](#FilterByValues) - [OmitBy](#OmitBy) - [OmitByKeys](#OmitByKeys) - [OmitByValues](#OmitByValues) - [Intersect](#Intersect) - [Keys](#Keys) - [Values](#Values) - [KeysBy](#KeysBy) - [ValuesBy](#ValuesBy) - [MapKeys](#MapKeys) - [MapValues](#MapValues) - [Entries](#Entries) - [FromEntries](#FromEntries) - [Transform](#Transform) - [Merge](#Merge) - [Minus](#Minus) - [IsDisjoint](#IsDisjoint) - [HasKey](#HasKey) - [MapToStruct](#MapToStruct) - [ToSortedSlicesDefault](#ToSortedSlicesDefault) - [ToSortedSlicesWithComparator](#ToSortedSlicesWithComparator) - [NewOrderedMap](#NewOrderedMap) - [OrderedMap_Set](#OrderedMap_Set) - [OrderedMap_Get](#OrderedMap_Get) - [OrderedMap_Front](#OrderedMap_Front) - [OrderedMap_Back](#OrderedMap_Back) - [OrderedMap_Delete](#OrderedMap_Delete) - [OrderedMap_Clear](#OrderedMap_Clear) - [OrderedMap_Len](#OrderedMap_Len) - [OrderedMap_Keys](#OrderedMap_Keys) - [OrderedMap_Values](#OrderedMap_Values) - [OrderedMap_Contains](#OrderedMap_Contains) - [OrderedMap_Range](#OrderedMap_Range) - [OrderedMap_Elements](#OrderedMap_Elements) - [OrderedMap_Iter](#OrderedMap_Iter) - [OrderedMap_ReverseIter](#OrderedMap_ReverseIter) - [OrderedMap_SortByKey](#OrderedMap_SortByKey) - [OrderedMap_MarshalJSON](#OrderedMap_MarshalJSON) - [OrderedMap_UnmarshalJSON](#OrderedMap_UnmarshalJSON) - [NewConcurrentMap](#NewConcurrentMap) - [ConcurrentMap_Get](#ConcurrentMap_Get) - [ConcurrentMap_Set](#ConcurrentMap_Set) - [ConcurrentMap_GetOrSet](#ConcurrentMap_GetOrSet) - [ConcurrentMap_Delete](#ConcurrentMap_Delete) - [ConcurrentMap_GetAndDelete](#ConcurrentMap_GetAndDelete) - [ConcurrentMap_Has](#ConcurrentMap_Has) - [ConcurrentMap_Range](#ConcurrentMap_Range) - [GetOrSet](#GetOrSet) - [SortByKey](#SortByKey) - [GetOrDefault](#GetOrDefault)
## Documentation ### MapTo

Rry to map any interface to struct or base type.

Signature: ```go func MapTo(src any, dst any) error ``` Example:[Run](https://go.dev/play/p/4K7KBEPgS5M) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { type ( Person struct { Name string `json:"name"` Age int `json:"age"` Phone string `json:"phone"` Addr Address `json:"address"` } Address struct { Street string `json:"street"` Number int `json:"number"` } ) personInfo := map[string]interface{}{ "name": "Nothin", "age": 28, "phone": "123456789", "address": map[string]interface{}{ "street": "test", "number": 1, }, } var p Person err := MapTo(personInfo, &p) fmt.Println(err) fmt.Println(p) // Output: // // {Nothin 28 123456789 {test 1}} } ``` ### ForEach

Executes iteratee funcation for every key and value pair in map.

Signature: ```go func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V)) ``` Example:[Run](https://go.dev/play/p/OaThj6iNVXK) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, "d": 4, } var sum int maputil.ForEach(m, func(_ string, value int) { sum += value }) fmt.Println(sum) // Output: // 10 } ``` ### Filter

Iterates over map, return a new map contains all key and value pairs pass the predicate function.

Signature: ```go func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V ``` Example:[Run](https://go.dev/play/p/fSvF3wxuNG7) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5, } isEven := func(_ string, value int) bool { return value%2 == 0 } maputil.Filter(m, func(_ string, value int) { sum += value }) result := maputil.Filter(m, isEven) fmt.Println(result) // Output: // map[b:2 d:4] } ``` ### FilterByKeys

Iterates over map, return a new map whose keys are all given keys.

Signature: ```go func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V ``` Example:[Run](https://go.dev/play/p/7ov6BJHbVqh) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5, } result := maputil.FilterByKeys(m, []string{"a", "b"}) fmt.Println(result) // Output: // map[a:1 b:2] } ``` ### FilterByValues

Iterates over map, return a new map whose values are all given values.

Signature: ```go func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V ``` Example:[Run](https://go.dev/play/p/P3-9MdcXegR) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5, } result := maputil.FilterByValues(m, []int{3, 4}) fmt.Println(result) // Output: // map[c:3 d:4] } ``` ### OmitBy

OmitBy is the opposite of Filter, removes all the map elements for which the predicate function returns true.

Signature: ```go func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V ``` Example:[Run](https://go.dev/play/p/YJM4Hj5hNwm) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5, } isEven := func(_ string, value int) bool { return value%2 == 0 } result := maputil.OmitBy(m, isEven) fmt.Println(result) // Output: // map[a:1 c:3 e:5] } ``` ### OmitByKeys

The opposite of FilterByKeys, extracts all the map elements which keys are not omitted.

Signature: ```go func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V ``` Example:[Run](https://go.dev/play/p/jXGrWDBfSRp) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5, } result := maputil.OmitByKeys(m, []string{"a", "b"}) fmt.Println(result) // Output: // map[c:3 d:4 e:5] } ``` ### OmitByValues

The opposite of FilterByValues. remov all elements whose value are in the give slice.

Signature: ```go func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V ``` Example:[Run](https://go.dev/play/p/XB7Y10uw20_U) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5, } result := maputil.OmitByValues(m, []int{4, 5}) fmt.Println(result) // Output: // map[a:1 b:2 c:3] } ``` ### Intersect

Iterates over maps, return a new map of key and value pairs in all given maps.

Signature: ```go func Intersect[K comparable, V any](maps ...map[K]V) map[K]V ``` Example:[Run](https://go.dev/play/p/Zld0oj3sjcC) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m1 := map[string]int{ "a": 1, "b": 2, "c": 3, } m2 := map[string]int{ "a": 1, "b": 2, "c": 6, "d": 7, } m3 := map[string]int{ "a": 1, "b": 9, "e": 9, } result1 := maputil.Intersect(m1) result2 := maputil.Intersect(m1, m2) result3 := maputil.Intersect(m1, m2, m3) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // map[a:1 b:2 c:3] // map[a:1 b:2] // map[a:1] } ``` ### Keys

Returns a slice of the map's keys.

Signature: ```go func Keys[K comparable, V any](m map[K]V) []K ``` Example:[Run](https://go.dev/play/p/xNB5bTb97Wd) ```go package main import ( "fmt" "sort" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 1: "a", 2: "a", 3: "b", 4: "c", 5: "d", } keys := maputil.Keys(m) sort.Ints(keys) fmt.Println(keys) // Output: // [1 2 3 4 5] } ``` ### Merge

Merge maps, next key will overwrite previous key.

Signature: ```go func Merge[K comparable, V any](maps ...map[K]V) map[K]V ``` Example:[Run](https://go.dev/play/p/H95LENF1uB-) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m1 := map[int]string{ 1: "a", 2: "b", } m2 := map[int]string{ 1: "1", 3: "2", } result := maputil.Merge(m1, m2) fmt.Println(result) // Output: // map[1:c 2:b 3:d] } ``` ### Minus

Creates an map of whose key in mapA but not in mapB.

Signature: ```go func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V ``` Example:[Run](https://go.dev/play/p/3u5U9K7YZ9m) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m1 := map[string]int{ "a": 1, "b": 2, "c": 3, } m2 := map[string]int{ "a": 11, "b": 22, "d": 33, } result := maputil.Minus(m1, m2) fmt.Println(result) // Output: // map[c:3] } ``` ### Values

Returns a slice of the map's values.

Signature: ```go func Values[K comparable, V any](m map[K]V) []V ``` Example:[Run](https://go.dev/play/p/CBKdUc5FTW6) ```go package main import ( "fmt" "sort" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 1: "a", 2: "a", 3: "b", 4: "c", 5: "d", } values := maputil.Values(m) sort.Strings(values) fmt.Println(values) // Output: // [a a b c d] } ``` ### KeysBy

Creates a slice whose element is the result of function mapper invoked by every map's key.

Signature: ```go func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T ``` Example:[Run](https://go.dev/play/p/hI371iB8Up8) ```go package main import ( "fmt" "sort" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 1: "a", 2: "a", 3: "b", } keys := maputil.KeysBy(m, func(n int) int { return n + 1 }) sort.Ints(keys) fmt.Println(keys) // Output: // [2 3 4] } ``` ### ValuesBy

Creates a slice whose element is the result of function mapper invoked by every map's value.

Signature: ```go func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T ``` Example:[Run](https://go.dev/play/p/sg9-oRidh8f) ```go package main import ( "fmt" "sort" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 1: "a", 2: "b", 3: "c", } values := maputil.ValuesBy(m, func(v string) string { switch v { case "a": return "a-1" case "b": return "b-2" case "c": return "c-3" default: return "" } }) sort.Strings(values) fmt.Println(values) // Output: // [a-1 b-2 c-3] } ``` ### MapKeys

Transforms a map to other type map by manipulating it's keys.

Signature: ```go func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V ``` Example:[Run](https://go.dev/play/p/8scDxWeBDKd) ```go package main import ( "fmt" "strconv" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 1: "a", 2: "b", 3: "c", } result := maputil.MapKeys(m, func(k int, _ string) string { return strconv.Itoa(k) }) fmt.Println(result) // Output: // map[1:a 2:b 3:c] } ``` ### MapValues

Transforms a map to other type map by manipulating it's values.

Signature: ```go func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T ``` Example:[Run](https://go.dev/play/p/g92aY3fc7Iw) ```go package main import ( "fmt" "strconv" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 1: "a", 2: "b", 3: "c", } result := maputil.MapValues(m, func(k int, v string) string { return v + strconv.Itoa(k) }) fmt.Println(result) // Output: // map[1:a1 2:b2 3:c3] } ``` ### Entry

Transforms a map into array of key/value pairs.

Signature: ```go type Entry[K comparable, V any] struct { Key K Value V } func Entries[K comparable, V any](m map[K]V) []Entry[K, V] ``` Example:[Run](https://go.dev/play/p/Ltb11LNcElY) ```go package main import ( "fmt" "sort" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, } result := maputil.Entries(m) sort.Slice(result, func(i, j int) bool { return result[i].Value < result[j].Value }) fmt.Println(result) // Output: // [{a 1} {b 2} {c 3}] } ``` ### FromEntries

Creates a map based on a slice of key/value pairs.

Signature: ```go type Entry[K comparable, V any] struct { Key K Value V } func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V ``` Example:[Run](https://go.dev/play/p/fTdu4sCNjQO) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { result := maputil.FromEntries([]Entry[string, int]{ {Key: "a", Value: 1}, {Key: "b", Value: 2}, {Key: "c", Value: 3}, }) fmt.Println(result) // Output: // map[a:1 b:2 c:3] } ``` ### Transform

Transform a map to another type map.

Signature: ```go func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2 ``` Example:[Run](https://go.dev/play/p/P6ovfToM3zj) ```go package main import ( "fmt" "strconv" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, "c": 3, } result := Transform(m, func(k string, v int) (string, string) { return k, strconv.Itoa(v) }) fmt.Println(result) // Output: // map[a:1 b:2 c:3] } ``` ### IsDisjoint

Checks two maps are disjoint if they have no keys in common.

Signature: ```go func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool ``` Example:[Run](https://go.dev/play/p/N9qgYg_Ho6f) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m1 := map[string]int{ "a": 1, "b": 2, "c": 3, } m2 := map[string]int{ "d": 22, } m3 := map[string]int{ "a": 22, } result1 := maputil.IsDisjoint(m1, m2) result2 := maputil.IsDisjoint(m1, m3) fmt.Println(result1) fmt.Println(result2) // Output: // true // false } ``` ### HasKey

Checks if map has key or not. This function is used to replace the following boilerplate code:

```go _, haskey := amap["baz"]; if haskey { fmt.Println("map has key baz") } ``` Signature: ```go func HasKey[K comparable, V any](m map[K]V, key K) bool ``` Example:[Run](https://go.dev/play/p/isZZHOsDhFc) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[string]int{ "a": 1, "b": 2, } result1 := maputil.HasKey(m, "a") result2 := maputil.HasKey(m, "c") fmt.Println(result1) fmt.Println(result2) // Output: // true // false } ``` ### MapToStruct

Converts map to struct

Signature: ```go func MapToStruct(m map[string]any, structObj any) error ``` Example:[Run](https://go.dev/play/p/7wYyVfX38Dp) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { personReqMap := map[string]any{ "name": "Nothin", "max_age": 35, "page": 1, "pageSize": 10, } type PersonReq struct { Name string `json:"name"` MaxAge int `json:"max_age"` Page int `json:"page"` PageSize int `json:"pageSize"` } var personReq PersonReq _ = maputil.MapToStruct(personReqMap, &personReq) fmt.Println(personReq) // Output: // {Nothin 35 1 10} } ``` ### ToSortedSlicesDefault

Translate the key and value of the map into two slices that are sorted in ascending order according to the key’s value, with the position of the elements in the value slice corresponding to the key.

Signature: ```go func ToSortedSlicesDefault[K constraints.Ordered, V any](m map[K]V) ([]K, []V) ``` Example:[Run](https://go.dev/play/p/43gEM2po-qy) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 1: "a", 3: "c", 2: "b", } keys, values := maputil.ToSortedSlicesDefault(m) fmt.Println(keys) fmt.Println(values) // Output: // [1 2 3] // [a b c] } ``` ### ToSortedSlicesWithComparator

Translate the key and value of the map into two slices that are sorted according to a custom sorting rule defined by a comparator function based on the key's value, with the position of the elements in the value slice corresponding to the key.

Signature: ```go func ToSortedSlicesWithComparator[K comparable, V any](m map[K]V, comparator func(a, b K) bool) ([]K, []V) ``` Example:[Run](https://go.dev/play/p/0nlPo6YLdt3) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m1 := map[time.Time]string{ time.Date(2024, 3, 31, 0, 0, 0, 0, time.UTC): "today", time.Date(2024, 3, 30, 0, 0, 0, 0, time.UTC): "yesterday", time.Date(2024, 4, 1, 0, 0, 0, 0, time.UTC): "tomorrow", } keys1, values1 := maputil.ToSortedSlicesWithComparator(m1, func(a, b time.Time) bool { return a.Before(b) }) m2 := map[int]string{ 1: "a", 3: "c", 2: "b", } keys2, values2 := maputil.ToSortedSlicesWithComparator(m2, func(a, b int) bool { return a > b }) fmt.Println(keys2) fmt.Println(values2) fmt.Println(keys1) fmt.Println(values1) // Output: // [3 2 1] // [c b a] // [2024-03-30 00:00:00 +0000 UTC 2024-03-31 00:00:00 +0000 UTC 2024-04-01 00:00:00 +0000 UTC] // [yesterday today tomorrow] } ``` ### NewOrderedMap

Creates a new OrderedMap.

Signature: ```go func NewOrderedMap[K comparable, V any]() *OrderedMap[K, V] ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) val1, ok := om.Get("a") fmt.Println(val1, ok) val2, ok := om.Get("d") fmt.Println(val2, ok) // Output: // 1 true // 0 false } ``` ### OrderedMap_Set

Sets the given key-value pair.

Signature: ```go func (om *OrderedMap[K, V]) Set(key K, value V) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) val1, ok := om.Get("a") fmt.Println(val1, ok) val2, ok := om.Get("d") fmt.Println(val2, ok) // Output: // 1 true // 0 false } ``` ### OrderedMap_Get

Returns the value for the given key.

Signature: ```go func (om *OrderedMap[K, V]) Get(key K) (V, bool) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) val1, ok := om.Get("a") fmt.Println(val1, ok) val2, ok := om.Get("d") fmt.Println(val2, ok) // Output: // 1 true // 0 false } ``` ### OrderedMap_Delete

Deletes the key-value pair for the given key.

Signature: ```go func (om *OrderedMap[K, V]) Delete(key K) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) om.Delete("b") fmt.Println(om.Keys()) // Output: // [a c] } ``` ### OrderedMap_Clear

Clears the map.

Signature: ```go func (om *OrderedMap[K, V]) Clear() ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) om.Clear() fmt.Println(om.Keys()) // Output: // [] } ``` ### OrderedMap_Front

Returns the first key-value pair.

Signature: ```go func (om *OrderedMap[K, V]) Front() (struct { Key K Value V }, bool) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) frontElement, ok := om.Front() fmt.Println(frontElement) fmt.Println(ok) // Output: // {a 1} // true } ``` ### OrderedMap_Back

Returns the last key-value pair.

Signature: ```go func (om *OrderedMap[K, V]) Back() (struct { Key K Value V }, bool) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) frontElement, ok := om.Front() fmt.Println(frontElement) fmt.Println(ok) // Output: // {a 1} // true } ``` ### OrderedMap_Range

Calls the given function for each key-value pair.

Signature: ```go func (om *OrderedMap[K, V]) Range(iteratee func(key K, value V) bool) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) om.Range(func(key string, value int) bool { fmt.Println(key, value) return true }) // Output: // a 1 // b 2 // c 3 } ``` ### OrderedMap_Keys

Returns the keys in order.

Signature: ```go func (om *OrderedMap[K, V]) Keys() []K ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) keys := om.Keys() fmt.Println(keys) // Output: // [a b c] } ``` ### OrderedMap_Values

Returns the values in order.

Signature: ```go func (om *OrderedMap[K, V]) Values() []V ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) values := om.Values() fmt.Println(values) // Output: // [1 2 3] } ``` ### OrderedMap_Elements

Returns the key-value pairs in order.

Signature: ```go func (om *OrderedMap[K, V]) Elements() []struct ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) elements := om.Elements() fmt.Println(elements) // Output: // [{a 1} {b 2} {c 3}] } ``` ### OrderedMap_Len

Returns the number of key-value pairs.

Signature: ```go func (om *OrderedMap[K, V]) Len() int ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) om.Len() fmt.Println(om.Len()) // Output: // 3 } ``` ### OrderedMap_Contains

Returns true if the given key exists.

Signature: ```go func (om *OrderedMap[K, V]) Contains(key K) bool ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) result1 := om.Contains("a") result2 := om.Contains("d") fmt.Println(result1) fmt.Println(result2) // Output: // true // false } ``` ### OrderedMap_Iter

Returns a channel that yields key-value pairs in order.

Signature: ```go func (om *OrderedMap[K, V]) Iter() <-chan struct { Key K Value V } ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) for elem := range om.Iter() { fmt.Println(elem) } // Output: // {a 1} // {b 2} // {c 3} } ``` ### OrderedMap_ReverseIter

Returns a channel that yields key-value pairs in reverse order.

Signature: ```go func (om *OrderedMap[K, V]) ReverseIter() <-chan struct { Key K Value V } ``` Example:[Run]() ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set("a", 1) om.Set("b", 2) om.Set("c", 3) for elem := range om.ReverseIter() { fmt.Println(elem) } // Output: // {c 3} // {b 2} // {a 1} } ``` ### OrderedMap_SortByKey

Sorts the map by key given less function.

Signature: ```go func (om *OrderedMap[K, V]) SortByKey(less func(a, b K) bool) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set(3, "c") om.Set(1, "a") om.Set(4, "d") om.Set(2, "b") om.SortByKey(func(a, b int) bool { return a < b }) fmt.Println(om.Elements()) // Output: // [{1 a} {2 b} {3 c} {4 d}] } ``` ### OrderedMap_MarshalJSON

Implements the json.Marshaler interface.

Signature: ```go func (om *OrderedMap[K, V]) MarshalJSON() ([]byte, error) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() om.Set(3, "c") om.Set(1, "a") om.Set(4, "d") om.Set(2, "b") b, _ := om.MarshalJSON() fmt.Println(string(b)) // Output: // {"a":1,"b":2,"c":3} } ``` ### OrderedMap_UnmarshalJSON

Implements the json.Unmarshaler interface.

Signature: ```go func (om *OrderedMap[K, V]) UnmarshalJSON(data []byte) error ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { om := maputil.NewOrderedMap[string, int]() data := []byte(`{"a":1,"b":2,"c":3}`) om.UnmarshalJSON(data) fmt.Println(om.Elements()) // Output: } ``` ### NewConcurrentMap

ConcurrentMap is like map, but is safe for concurrent use by multiple goroutines.

Signature: ```go // NewConcurrentMap create a ConcurrentMap with specific shard count. func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V] ``` Example:[Run](https://go.dev/play/p/3PenTPETJT0) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { // create a ConcurrentMap whose key type is string, value type is int cm := maputil.NewConcurrentMap[string, int](100) } ``` ### ConcurrentMap_Set

Set the value for a key.

Signature: ```go func (cm *ConcurrentMap[K, V]) Set(key K, value V) ``` Example:[Run](https://go.dev/play/p/3PenTPETJT0) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { cm := maputil.NewConcurrentMap[string, int](100) var wg1 sync.WaitGroup wg1.Add(5) for i := 0; i < 5; i++ { go func(n int) { cm.Set(fmt.Sprintf("%d", n), n) wg1.Done() }(i) } wg1.Wait() var wg2 sync.WaitGroup wg2.Add(5) for j := 0; j < 5; j++ { go func(n int) { val, ok := cm.Get(fmt.Sprintf("%d", n)) fmt.Println(val, ok) wg2.Done() }(j) } wg2.Wait() // output: (order may change) // 1 true // 3 true // 2 true // 0 true // 4 true } ``` ### ConcurrentMap_Get

Get the value stored in the map for a key, or nil if no.

Signature: ```go func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool) ``` Example:[Run](https://go.dev/play/p/3PenTPETJT0) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { cm := maputil.NewConcurrentMap[string, int](100) var wg1 sync.WaitGroup wg1.Add(5) for i := 0; i < 5; i++ { go func(n int) { cm.Set(fmt.Sprintf("%d", n), n) wg1.Done() }(i) } wg1.Wait() var wg2 sync.WaitGroup wg2.Add(5) for j := 0; j < 5; j++ { go func(n int) { val, ok := cm.Get(fmt.Sprintf("%d", n)) fmt.Println(val, ok) wg2.Done() }(j) } wg2.Wait() // output: (order may change) // 1 true // 3 true // 2 true // 0 true // 4 true } ``` ### ConcurrentMap_GetOrSet

Returns the existing value for the key if present. Otherwise, it sets and returns the given value.

Signature: ```go func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool) ``` Example:[Run](https://go.dev/play/p/aDcDApOK01a) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { cm := maputil.NewConcurrentMap[string, int](100) var wg sync.WaitGroup wg.Add(5) for i := 0; i < 5; i++ { go func(n int) { val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n) fmt.Println(val, ok) wg.Done() }(i) } wg.Wait() // output: (order may change) // 1 false // 3 false // 2 false // 0 false // 4 false } ``` ### ConcurrentMap_Delete

Delete the value for a key.

Signature: ```go func (cm *ConcurrentMap[K, V]) Delete(key K) ``` Example:[Run](https://go.dev/play/p/uTIJZYhpVMS) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { cm := maputil.NewConcurrentMap[string, int](100) var wg1 sync.WaitGroup wg1.Add(5) for i := 0; i < 5; i++ { go func(n int) { cm.Set(fmt.Sprintf("%d", n), n) wg1.Done() }(i) } wg1.Wait() var wg2 sync.WaitGroup wg2.Add(5) for j := 0; j < 5; j++ { go func(n int) { cm.Delete(fmt.Sprintf("%d", n)) wg2.Done() }(j) } wg2.Wait() } ``` ### ConcurrentMap_GetAndDelete

Returns the existing value for the key if present and then delete the value for the key. Otherwise, do nothing, just return false.

Signature: ```go func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool) ``` Example:[Run](https://go.dev/play/p/ZyxeIXSZUiM) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { cm := maputil.NewConcurrentMap[string, int](100) var wg1 sync.WaitGroup wg1.Add(5) for i := 0; i < 5; i++ { go func(n int) { cm.Set(fmt.Sprintf("%d", n), n) wg1.Done() }(i) } wg1.Wait() var wg2 sync.WaitGroup wg2.Add(5) for j := 0; j < 5; j++ { go func(n int) { val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n)) fmt.Println(val, ok) //n, true _, ok = cm.Get(fmt.Sprintf("%d", n)) fmt.Println(val, ok) //false wg2.Done() }(j) } wg2.Wait() } ``` ### ConcurrentMap_Has

Checks if map has the value for a key.

Signature: ```go func (cm *ConcurrentMap[K, V]) Has(key K) bool ``` Example:[Run](https://go.dev/play/p/C8L4ul9TVwf) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { cm := maputil.NewConcurrentMap[string, int](100) var wg1 sync.WaitGroup wg1.Add(5) for i := 0; i < 5; i++ { go func(n int) { cm.Set(fmt.Sprintf("%d", n), n) wg1.Done() }(i) } wg1.Wait() var wg2 sync.WaitGroup wg2.Add(5) for j := 0; j < 5; j++ { go func(n int) { ok := cm.Has(fmt.Sprintf("%d", n)) fmt.Println(ok) // true wg2.Done() }(j) } wg2.Wait() } ``` ### ConcurrentMap_Range

Calls iterator sequentially for each key and value present in each of the shards in the map. If iterator returns false, range stops the iteration.

Signature: ```go func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool) ``` Example:[Run](https://go.dev/play/p/iqcy7P8P0Pr) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { cm := maputil.NewConcurrentMap[string, int](100) var wg1 sync.WaitGroup wg1.Add(5) for i := 0; i < 5; i++ { go func(n int) { cm.Set(fmt.Sprintf("%d", n), n) wg1.Done() }(i) } wg1.Wait() cm.Range(func(key string, value int) bool { fmt.Println(value) return true }) } ``` ### GetOrSet

Returns value of the given key or set the given value value if not present.

Signature: ```go func GetOrSet[K comparable, V any](m map[K]V, key K, value V) V ``` Example:[Run](https://go.dev/play/p/IVQwO1OkEJC) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 1: "a", } result1 := maputil.GetOrSet(m, 1, "1") result2 := maputil.GetOrSet(m, 2, "b") fmt.Println(result1) fmt.Println(result2) // Output: // a // b } ``` ### SortByKey

Sorts the map by its keys and returns a new map with sorted keys.

Signature: ```go func SortByKey[K constraints.Ordered, V any](m map[K]V) (sortedKeysMap map[K]V) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 3: "c", 1: "a", 4: "d", 2: "b", } result := maputil.SortByKey(m) fmt.Println(result) // Output: // map[1:a 2:b 3:c 4:d] } ``` ### GetOrDefault

returns the value of the given key or a default value if the key is not present.

Signature: ```go func GetOrDefault[K comparable, V any](m map[K]V, key K, defaultValue V) V ``` Example:[运行](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/maputil" ) func main() { m := map[int]string{ 3: "c", 1: "a", 4: "d", 2: "b", } result1 := maputil.GetOrDefault(m, 1, "default") result2 := maputil.GetOrDefault(m, 6, "default") fmt.Println(result1) fmt.Println(result2) // Output: // a // default } ```