perf(map): add size hints to PickBy/OmitBy family (#836)

Pre-allocate maps with size hints instead of empty map literals
to avoid repeated rehashing as entries are added.

- PickBy, PickByErr: make(Map, len(in))
- PickByKeys: make(Map, len(keys))
- PickByValues: make(Map, len(values))
- OmitBy, OmitByErr, OmitByKeys, OmitByValues: make(Map, len(in))
This commit is contained in:
Samuel Berthe
2026-03-06 01:34:35 +01:00
committed by GitHub
parent 0d0ceb74f1
commit 6572c7fd22
+8 -8
View File
@@ -103,7 +103,7 @@ func ValueOr[K comparable, V any](in map[K]V, key K, fallback V) V {
// PickBy returns same map type filtered by given predicate.
// Play: https://go.dev/play/p/kdg8GR_QMmf
func PickBy[K comparable, V any, Map ~map[K]V](in Map, predicate func(key K, value V) bool) Map {
r := Map{}
r := make(Map, len(in))
for k, v := range in {
if predicate(k, v) {
r[k] = v
@@ -115,7 +115,7 @@ func PickBy[K comparable, V any, Map ~map[K]V](in Map, predicate func(key K, val
// PickByErr returns same map type filtered by given predicate.
// It returns the first error returned by the predicate.
func PickByErr[K comparable, V any, Map ~map[K]V](in Map, predicate func(key K, value V) (bool, error)) (Map, error) {
r := Map{}
r := make(Map, len(in))
for k, v := range in {
ok, err := predicate(k, v)
if err != nil {
@@ -131,7 +131,7 @@ func PickByErr[K comparable, V any, Map ~map[K]V](in Map, predicate func(key K,
// PickByKeys returns same map type filtered by given keys.
// Play: https://go.dev/play/p/R1imbuci9qU
func PickByKeys[K comparable, V any, Map ~map[K]V](in Map, keys []K) Map {
r := Map{}
r := make(Map, len(keys))
for i := range keys {
if v, ok := in[keys[i]]; ok {
r[keys[i]] = v
@@ -143,7 +143,7 @@ func PickByKeys[K comparable, V any, Map ~map[K]V](in Map, keys []K) Map {
// PickByValues returns same map type filtered by given values.
// Play: https://go.dev/play/p/-_PPkSbO1Kc
func PickByValues[K, V comparable, Map ~map[K]V](in Map, values []V) Map {
r := Map{}
r := make(Map, len(values))
seen := Keyify(values)
for k, v := range in {
@@ -157,7 +157,7 @@ func PickByValues[K, V comparable, Map ~map[K]V](in Map, values []V) Map {
// OmitBy returns same map type filtered by given predicate.
// Play: https://go.dev/play/p/EtBsR43bdsd
func OmitBy[K comparable, V any, Map ~map[K]V](in Map, predicate func(key K, value V) bool) Map {
r := Map{}
r := make(Map, len(in))
for k, v := range in {
if !predicate(k, v) {
r[k] = v
@@ -169,7 +169,7 @@ func OmitBy[K comparable, V any, Map ~map[K]V](in Map, predicate func(key K, val
// OmitByErr returns same map type filtered by given predicate.
// It returns the first error returned by the predicate.
func OmitByErr[K comparable, V any, Map ~map[K]V](in Map, predicate func(key K, value V) (bool, error)) (Map, error) {
r := Map{}
r := make(Map, len(in))
for k, v := range in {
ok, err := predicate(k, v)
if err != nil {
@@ -185,7 +185,7 @@ func OmitByErr[K comparable, V any, Map ~map[K]V](in Map, predicate func(key K,
// OmitByKeys returns same map type filtered by given keys.
// Play: https://go.dev/play/p/t1QjCrs-ysk
func OmitByKeys[K comparable, V any, Map ~map[K]V](in Map, keys []K) Map {
r := Map{}
r := make(Map, len(in))
for k, v := range in {
r[k] = v
}
@@ -198,7 +198,7 @@ func OmitByKeys[K comparable, V any, Map ~map[K]V](in Map, keys []K) Map {
// OmitByValues returns same map type filtered by given values.
// Play: https://go.dev/play/p/9UYZi-hrs8j
func OmitByValues[K, V comparable, Map ~map[K]V](in Map, values []V) Map {
r := Map{}
r := make(Map, len(in))
seen := Keyify(values)
for k, v := range in {