# 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 ### MapToRry 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: //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 } ``` ### FilterIterates 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] } ``` ### FilterByKeysIterates 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] } ``` ### FilterByValuesIterates 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] } ``` ### OmitByOmitBy 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] } ``` ### OmitByKeysThe 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] } ``` ### OmitByValuesThe 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] } ``` ### IntersectIterates 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] } ``` ### KeysReturns 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] } ``` ### MergeMerge 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] } ``` ### MinusCreates 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] } ``` ### ValuesReturns 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] } ``` ### KeysByCreates 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] } ``` ### ValuesByCreates 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] } ``` ### MapKeysTransforms 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] } ``` ### MapValuesTransforms 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] } ``` ### EntryTransforms 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}] } ``` ### FromEntriesCreates 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] } ``` ### TransformTransform 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] } ``` ### IsDisjointChecks 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 } ``` ### HasKeyChecks 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 } ``` ### MapToStructConverts 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} } ``` ### ToSortedSlicesDefaultTranslate 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] } ``` ### ToSortedSlicesWithComparatorTranslate 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] } ``` ### NewOrderedMapCreates 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_SetSets 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_GetReturns 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_DeleteDeletes 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_ClearClears 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_FrontReturns 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_BackReturns 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_RangeCalls 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_KeysReturns 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_ValuesReturns 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_ElementsReturns 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_LenReturns 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_ContainsReturns 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_IterReturns 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_ReverseIterReturns 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_SortByKeySorts 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_MarshalJSONImplements 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_UnmarshalJSONImplements 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: } ``` ### NewConcurrentMapConcurrentMap 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_SetSet 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_GetGet 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_GetOrSetReturns 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_DeleteDelete 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_GetAndDeleteReturns 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_HasChecks 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_RangeCalls 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 }) } ``` ### GetOrSetReturns 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 } ``` ### SortByKeySorts 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] } ``` ### GetOrDefaultreturns 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 } ```