Documentation
¶
Overview ¶
* @Author: kamalyes 501893067@qq.com * @Date: 2024-11-09 00:50:58 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-06-09 15:30:22 * @FilePath: \go-toolbox\pkg\mathx\bit.go * @Description: 位操作相关工具函数集,包含64位和大整数位掩码的生成与解析 * * Copyright (c) 2024 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2025-05-29 13:15:55 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-05-29 13:55:21 * @FilePath: \go-toolbox\pkg\mathx\filter.go * @Description: * * Copyright (c) 2025 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2024-11-09 00:50:58 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-08-20 16:34:20 * @FilePath: \go-toolbox\pkg\mathx\number.go * @Description: * * Copyright (c) 2024 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2024-11-09 00:50:58 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2024-11-10 00:15:15 * @FilePath: \go-toolbox\pkg\mathx\proba.go * @Description: * 此文件定义了一个Proba结构体和相关的方法,用于根据给定的概率判断是否为真。 * * Copyright (c) 2024 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2026-08-25 00:50:58 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-08-25 00:50:58 * @FilePath: \go-toolbox\pkg\mathx\ratio.go * @Description: 比率计算与格式化,用于统计场景的成功率/失败率/取消率等 * * Copyright (c) 2026 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2023-07-28 00:50:58 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2026-01-23 10:50:01 * @FilePath: \go-toolbox\pkg\mathx\stats.go * @Description: 统计功能 * * Copyright (c) 2024 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2025-01-21 19:15:15 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-11-23 19:20:21 * @FilePath: \go-toolbox\pkg\mathx\ternary.go * @Description: 包提供了一组基于 Go 泛型实现的三元运算及条件执行函数,支持同步、异步、带错误处理等多种场景 * * Copyright (c) 2025 by kamalyes, All Rights Reserved.
* @Author: kamalyes 501893067@qq.com * @Date: 2024-11-09 00:50:58 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2024-12-06 09:15:55 * @FilePath: \go-toolbox\pkg\mathx\unstable.go * @Description: * * Copyright (c) 2024 by kamalyes, All Rights Reserved.
Index ¶
- func Abs[T types.Numerical](x T) T
- func AddUniqueSlice[T comparable](slice []T, items ...T) ([]T, bool)
- func AllSlice[T any](slice []T, predicate func(T) bool) bool
- func AnySlice[T any](slice []T, predicate func(T) bool) bool
- func AtLeast[T types.Numerical](x, lower T) T
- func AtMost[T types.Numerical](x, upper T) T
- func Between[T types.Numerical](x, lower, upper T) T
- func Bit64ToArray(bit uint64) []uint
- func BitToArrayBig(bits *big.Int) []uint
- func BubbleSort(arr []int)
- func CalcEntropy(m map[interface{}]int) float64
- func Clone(value interface{}, seen map[uintptr]interface{}) interface{}
- func CloneMap[K comparable, V any](m map[K]V) map[K]Vdeprecated
- func CompactSlice[T comparable](slice []T) []T
- func ContainsAllSlice[T comparable](slice []T, items ...T) bool
- func ContainsAnySlice[T comparable](slice []T, items ...T) bool
- func ConvertMapKeysToString(data interface{}) interface{}
- func CountPathSegments(path string, prefixes ...string) int
- func CountSlice[T any](slice []T, predicate func(T) bool) intdeprecated
- func Decimals[T types.Numerical](num T, digit int) string
- func DedupeValues[T any, K comparable](items []T, key func(T) (K, bool)) []K
- func DeepMergeMap(target, source map[string]interface{}, options *MapMergeOptions) (map[string]interface{}, error)
- func DefaultIfNilPtr[T any](param *T, defaultValue T) *T
- func EqualSlices[T comparable](a, b []T) bool
- func EqualUnorderedSlice[T comparable](a, b []T) booldeprecated
- func FilterMap[K comparable, V any](m map[K]V, predicate func(K, V) bool) map[K]Vdeprecated
- func FilterSlice[T any](slice []T, predicate func(T) bool) []T
- func FilterSliceByFunc[T any](slice []T, predicate func(T) bool) []T
- func FindLastSlice[T any](slice []T, predicate func(T) bool) (T, bool)
- func FindSlice[T any](slice []T, predicate func(T) bool) (T, bool)
- func FlattenMap(m map[string]interface{}, separator string) map[string]interface{}
- func FlattenSlice[T any](slices [][]T) []T
- func FormatPercentage(part, total uint64, precision int) string
- func FormatRatio(ratio float64, precision int) string
- func FormatRatioFromCount(part, total uint64, precision int) string
- func GetBit64(min, max, step uint) uint64
- func GetBitBig(min, max, step uint) *big.Int
- func GetNestedMapValue[T any](m map[string]interface{}, keys ...string) (T, bool)
- func GroupSliceBy[T any, K comparable](slice []T, keyFunc func(T) K) map[K][]T
- func IF[T any](condition bool, trueVal, falseVal T) T
- func IfAll[T any](conditions []bool, trueVal, falseVal T) T
- func IfAllEmpty[T any](values []interface{}, trueVal, falseVal T) T
- func IfAllowedField[T any](field string, allowedFields []string, trueVal, falseVal T) T
- func IfAny[T any](conditions []bool, trueVal, falseVal T) T
- func IfBetween[T types.Numerical](val, min, max T, trueVal, falseVal T) T
- func IfCEmpty[T comparable, R any](val T, trueVal, falseVal R) R
- func IfCall[T any](condition bool, result T, err error, callbacks ...func(T, error))
- func IfCast[R any](val any, defaultVal R) R
- func IfChain[T any](pairs []ConditionValue[T], defaultVal T) T
- func IfClamp[T types.Numerical](val, min, max T) T
- func IfContains[T comparable](slice []T, target T, trueVal, falseVal T) T
- func IfContainsChinese[T any](str string, trueVal, falseVal T) T
- func IfCount[T any](conditions []bool, threshold int, trueVal, falseVal T) T
- func IfCountGt[R any](count, threshold int64, trueVal, falseVal R) R
- func IfDefaultAndClamp[T types.Numerical](val, defaultVal, min, max T) T
- func IfDo[T any](condition bool, do DoFunc[T], defaultVal T) T
- func IfDoAF[T any](condition bool, do DoFunc[T], defaultFunc DoFunc[T]) T
- func IfDoAsync[T any](condition bool, do DoFunc[T], defaultVal ...T) <-chan T
- func IfDoAsyncWithTimeout[T any](condition bool, do DoFunc[T], timeoutMs int, defaultVal ...T) <-chan T
- func IfDoWithError[T any](condition bool, do DoFuncWithError[T], defaultVal T) (T, error)
- func IfDoWithErrorAsync[T any](condition bool, do DoFuncWithError[T], defaultVal T) <-chan ResultWithError[T]
- func IfDoWithErrorDefault[T any](condition bool, do DoFuncWithError[T], defaultVal T) T
- func IfElse[T any](conditions []bool, values []T, defaultVal T) T
- func IfEmpty[T any](val T, defaultVal T) T
- func IfEmptyDo[T any](val T, do DoFunc[T]) T
- func IfEmptySlice[T any, R any](slice []T, trueVal, falseVal R) R
- func IfEq[T comparable, R any](a, b T, trueVal, falseVal R) R
- func IfErrOrNil[T comparable, R any](val T, err error, trueVal, falseVal R) R
- func IfExec(condition bool, action func())
- func IfExecElse(condition bool, onTrue func(), onFalse ...func())
- func IfFilter[T any](useFilter bool, slice []T, predicate func(T) bool) []T
- func IfGe[T types.Numerical, R any](a, b T, trueVal, falseVal R) R
- func IfGeZero[T types.Numerical](val, defaultVal T) T
- func IfGt[T types.Numerical, R any](a, b T, trueVal, falseVal R) R
- func IfGtZero[T types.Numerical](val, defaultVal T) T
- func IfHasEmpty[T any](values []interface{}, trueVal, falseVal T) T
- func IfIPAllowed[T any](ip string, cidrList []string, trueVal, falseVal T) T
- func IfLe[T types.Numerical, R any](a, b T, trueVal, falseVal R) R
- func IfLeZero[T types.Numerical](val, defaultVal T) T
- func IfLenEq[T any, R any](slice []T, length int, trueVal, falseVal R) R
- func IfLenGt[T any, R any](slice []T, threshold int, trueVal, falseVal R) R
- func IfLt[T types.Numerical, R any](a, b T, trueVal, falseVal R) R
- func IfLtZero[T types.Numerical](val, defaultVal T) T
- func IfMap[T, R any](condition bool, val T, mapper func(T) R, defaultVal R) R
- func IfMapElse[T, R any](condition bool, val T, trueMapper func(T) R, falseMapper ...func(T) R) R
- func IfMemoized[T any](condition bool, key string, cache map[string]T, computeFn func() T, ...) T
- func IfMulti[T comparable, R any](target T, values []T, trueVal, falseVal R) R
- func IfNe[T comparable, R any](a, b T, trueVal, falseVal R) R
- func IfNil[T any](val interface{}, trueVal, falseVal T) T
- func IfNotCEmpty[T comparable, R any](val T, trueVal, falseVal R) R
- func IfNotEmpty(str string, defaultVal string) string
- func IfNotEmptyValue[T any](val T, defaultVal T) T
- func IfNotNil[T any](val *T, defaultVal T) T
- func IfNotNilValue[T any](val interface{}, trueVal, falseVal T) T
- func IfNotZero[T comparable](val T, defaultVal T) T
- func IfNull[T any](str string, trueVal, falseVal T) T
- func IfNullOrUndefined[T any](str string, trueVal, falseVal T) T
- func IfPipeline[T any](condition bool, input T, funcs []func(T) T, defaultVal T) T
- func IfSafeFieldName[T any](field string, trueVal, falseVal T) T
- func IfSafeIndex[T any](slice []T, index int, defaultVal T) T
- func IfSafeKey[K comparable, V any](m map[K]V, key K, defaultVal V) V
- func IfStrFmt(condition bool, trueFormat string, trueArgs []any, falseFormat string, ...) (string, []any)
- func IfSwitch[K comparable, V any](key K, cases map[K]V, defaultVal V) V
- func IfTryParse[T, R any](input T, parser func(T) (R, error), defaultVal R) R
- func IfUndefined[T any](str string, trueVal, falseVal T) T
- func IfValidate[T, R any](val T, validator func(T) bool, validVal, invalidVal R) R
- func IndexOfSlice[T comparable](slice []T, item T) int
- func InsertionSort(arr []int)
- func LastIndexOfSlice[T comparable](slice []T, item T) int
- func LongestCommonPrefix(a, b string) int
- func MapAssign[K comparable, V any, M ~map[K]V](maps ...M) M
- func MapClone[K comparable, V any](m map[K]V) map[K]V
- func MapFilterKeys[K comparable, V any](in map[K]V, predicate func(key K, value V) bool) []K
- func MapFilterToSlice[K comparable, V any, R any](in map[K]V, iteratee func(key K, value V) (R, bool)) []R
- func MapFilterValues[K comparable, V any](in map[K]V, predicate func(key K, value V) bool) []V
- func MapFromEntries[K comparable, V any](entries []MapEntry[K, V]) map[K]V
- func MapHasKey[K comparable, V any](in map[K]V, key K) bool
- func MapInvert[K, V comparable](in map[K]V) map[V]K
- func MapKeys[K comparable, V any](in ...map[K]V) []K
- func MapMapEntries[K1 comparable, V1 any, K2 comparable, V2 any](in map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2
- func MapMapKeys[K comparable, V any, R comparable](in map[K]V, iteratee func(value V, key K) R) map[R]V
- func MapMapValues[K comparable, V any, R any](in map[K]V, iteratee func(value V, key K) R) map[K]R
- func MapOmitBy[K comparable, V any, M ~map[K]V](in M, predicate func(key K, value V) bool) M
- func MapOmitByKeys[K comparable, V any, M ~map[K]V](in M, keys []K) M
- func MapOmitByValues[K, V comparable, M ~map[K]V](in M, values []V) M
- func MapPickBy[K comparable, V any, M ~map[K]V](in M, predicate func(key K, value V) bool) M
- func MapPickByKeys[K comparable, V any, M ~map[K]V](in M, keys []K) M
- func MapPickByValues[K, V comparable, M ~map[K]V](in M, values []V) M
- func MapSliceByKey[T any, K comparable](slice []T, keyFunc func(T) K) map[K]T
- func MapToSlice[K comparable, V any, R any](in map[K]V, iteratee func(key K, value V) R) []R
- func MapUniqKeys[K comparable, V any](in ...map[K]V) []K
- func MapUniqValues[K, V comparable](in ...map[K]V) []V
- func MapValueOr[K comparable, V any](in map[K]V, key K, fallback V) V
- func MapValues[K comparable, V any](in ...map[K]V) []V
- func MarshalJSONOrDefault(value any, defaultVal string) string
- func Max[T types.Numerical](values ...T) T
- func MaxSlice(values []float64) float64deprecated
- func Mean(values []float64) float64
- func MergeLayeredKeyValues[T any, KV any](layers []*T, fieldGetter func(*T) []KV, keyFieldName string, ...) []KV
- func MergeLayeredScalar[T any, V types.Numerical](layers []*T, fieldGetter func(*T) V) V
- func Min[T types.Numerical](values ...T) T
- func MinSlice(values []float64) float64
- func NoneSlice[T any](slice []T, predicate func(T) bool) bool
- func ParseInt64(s string) (int64, error)
- func PartitionSlice[T any](slice []T, predicate func(T) bool) (truthy, falsy []T)
- func Percentage(part, total uint64) float64
- func Percentile(values []float64, p float64) float64
- func Percentiles(values []float64, percentiles ...float64) map[float64]float64
- func QuickSort(arr []int, low, high int)
- func Ratio(part, total uint64) float64
- func RatioFloat(part, total float64) float64
- func RatioRound(part, total int64, precision int) float64
- func ReduceSlice[T any, R any](slice []T, initial R, accumulator func(R, T) R) R
- func RemoveSliceAt[T any](slice []T, index int) []T
- func RepeatField[T any](field T, count int) []T
- func ReturnIfErr[T any](val T, err error) (T, error)
- func ReverseSlice[T any](slice []T) []T
- func ReverseSliceInPlace[T any](slice []T)
- func SafeGetIndexOrDefault[T any](slice []T, index int, defaultVal T) (val T)
- func SafeGetIndexOrDefaultNoSpace(slice []string, index int, defaultVal string) string
- func SafeGetIndexWithErr[T any](slice []T, index int) (zero T, err error)
- func SetNestedMapValue(m map[string]interface{}, value interface{}, keys ...string)
- func ShallowMergeMap[K comparable, V any](maps ...map[K]V) map[K]Vdeprecated
- func SkipLastSlice[T any](slice []T, n int) []T
- func SkipSlice[T any](slice []T, n int) []T
- func SliceChunk[T any](slice []T, size int) [][]T
- func SliceContains[T types.Ordered](slice []T, element T) booldeprecated
- func SliceContainsComparable[T comparable](slice []T, element T) bool
- func SliceCountBy[T any](collection []T, predicate func(item T) bool) int
- func SliceCountValues[T comparable](collection []T) map[T]int
- func SliceCountValuesBy[T any, U comparable](collection []T, mapper func(item T) U) map[U]int
- func SliceCut[T comparable, Slice ~[]T](collection, separator Slice) (before, after Slice, found bool)
- func SliceDiff[T ~[]E, E comparable](list1 T, list2 T) (ret1 T, ret2 T)deprecated
- func SliceDiffSetSorted[T types.Ordered](arr1, arr2 []T) []T
- func SliceDifference[T comparable, Slice ~[]T](list1, list2 Slice) (Slice, Slice)
- func SliceDropRightWhile[T any, Slice ~[]T](collection Slice, predicate func(item T) bool) Slice
- func SliceDropWhile[T any, Slice ~[]T](collection Slice, predicate func(item T) bool) Slice
- func SliceElementsMatch[T comparable](list1, list2 []T) bool
- func SliceEqual[T comparable](a, b []T) bool
- func SliceFilterMap[T, R any](collection []T, callback func(item T, index int) (R, bool)) []R
- func SliceFilterToMap[T any, K comparable, V any](collection []T, transform func(item T, index int) (K, V, bool)) map[K]V
- func SliceFindDuplicates[T comparable, Slice ~[]T](collection Slice) Slice
- func SliceFindDuplicatesBy[T any, U comparable, Slice ~[]T](collection Slice, iteratee func(item T) U) Slice
- func SliceFindUniques[T comparable, Slice ~[]T](collection Slice) Slice
- func SliceFindUniquesBy[T any, U comparable, Slice ~[]T](collection Slice, iteratee func(item T) U) Slice
- func SliceFirst[T any](collection []T) (T, bool)
- func SliceFirstOr[T any](collection []T, fallback T) T
- func SliceFisherYates[T comparable](slice []T, maxRetries int) error
- func SliceFlatMap[T, R any](collection []T, iteratee func(item T, index int) []R) []R
- func SliceForEachWhile[T any](collection []T, iteratee func(item T, index int) bool)
- func SliceGroupByMap[T any, K comparable, V any](collection []T, iteratee func(item T) (K, V)) map[K][]V
- func SliceHasDuplicates[T comparable](slice []T) bool
- func SliceHasPrefix[T comparable](collection, prefix []T) bool
- func SliceHasSuffix[T comparable](collection, suffix []T) bool
- func SliceInterleave[T any, Slice ~[]T](collections ...Slice) Slice
- func SliceIntersect[T ~[]E, E comparable](list1 T, list2 T) T
- func SliceIsSorted[T types.Ordered](collection []T) bool
- func SliceIsSortedByKey[T any, K types.Ordered](collection []T, iteratee func(item T) K) bool
- func SliceLast[T any](collection []T) (T, bool)
- func SliceLastOr[T any](collection []T, fallback T) T
- func SliceMaxBy[T any](collection []T, comparison func(a, b T) bool) T
- func SliceMaxIndexBy[T any](collection []T, comparison func(a, b T) bool) (T, int)
- func SliceMaxOrdered[T types.Ordered](collection []T) T
- func SliceMinBy[T any](collection []T, comparison func(a, b T) bool) T
- func SliceMinIndexBy[T any](collection []T, comparison func(a, b T) bool) (T, int)
- func SliceMinMax[T types.Numerical](list []T, f types.MinMaxFunc[T]) (T, error)
- func SliceMinOrdered[T types.Ordered](collection []T) T
- func SliceNth[T any](collection []T, nth int) (T, error)
- func SliceNthOr[T any](collection []T, nth int, fallback T) T
- func SlicePartitionBy[T any, K comparable, Slice ~[]T](collection Slice, iteratee func(item T) K) []Slice
- func SliceReject[T any, Slice ~[]T](collection Slice, predicate func(item T, index int) bool) Slice
- func SliceRemove[T any](arr []T, condition func(T) bool) []Tdeprecated
- func SliceRemoveDuplicates[T comparable](numbers []T) []Tdeprecated
- func SliceRemoveEmpty[T any](slice []T) []T
- func SliceRemoveValue[T comparable, Slice ~[]T](arr Slice, value T) Slicedeprecated
- func SliceRemoveZero[T comparable](arr []T) []Tdeprecated
- func SliceReplace[T comparable, Slice ~[]T](collection Slice, old, nEw T, n int) Slice
- func SliceReplaceAll[T comparable, Slice ~[]T](collection Slice, old, nEw T) Slice
- func SliceSubset[T any, Slice ~[]T](collection Slice, offset int, length uint) Slice
- func SliceTimes[T any](count int, iteratee func(index int) T) []T
- func SliceToMap[T any, K comparable](collection []T, iteratee func(item T) K) map[K]T
- func SliceUnion[T comparable](arr1, arr2 []T) []Tdeprecated
- func SliceUnionMulti[T comparable, Slice ~[]T](lists ...Slice) Slice
- func SliceUniq[T ~[]E, E comparable](list T) T
- func SliceUniqMap[T any, R comparable](collection []T, iteratee func(item T, index int) R) []R
- func SliceWithout[T ~[]E, E comparable](list T, exclude ...E) T
- func SliceWithoutBy[T any, K comparable, Slice ~[]T](collection Slice, iteratee func(item T) K, exclude ...K) Slice
- func SortByCount[T any](items []T, getCount func(T) uint64)
- func SortByKey[T any, K cmp.Ordered](items []T, getKey func(T) K)
- func SortByKeyDesc[T any, K cmp.Ordered](items []T, getKey func(T) K)
- func SortByKeyDescUnique[T any, K cmp.Ordered, ID comparable](items []T, getKey func(T) K, getID func(T) ID) []T
- func StdDev(values []float64) float64
- func TakeLastSlice[T any](slice []T, n int) []T
- func TakeSlice[T any](slice []T, n int) []T
- func TransformAndCompactSlice[T any, R comparable](slice []T, transform func(T) R) []R
- func TransformAndFilterSlice[T any, R any](slice []T, transform func(T) R, predicate func(R) bool) []Rdeprecated
- func TransformMapKeys[K comparable, V any, R comparable](m map[K]V, transform func(K) R) map[R]Vdeprecated
- func TransformMapValues[K comparable, V any, R any](m map[K]V, transform func(V) R) map[K]Rdeprecated
- func TransformSlice[T any, R any](slice []T, transform func(T) R) []R
- func UnflattenMap(m map[string]interface{}, separator string) map[string]interface{}
- func UniqueSliceBy[T any, K comparable](slice []T, keyFunc func(T) K) []T
- func ZeroValue[T any]() T
- type ConditionValue
- type DoFunc
- type DoFuncWithError
- type FilterCallback
- type FindResult
- func (r *FindResult[T, V]) Do(f func(*FindResult[T, V])) *FindResult[T, V]
- func (r *FindResult[T, V]) IfFound(f func(*T, *V)) *FindResult[T, V]
- func (r *FindResult[T, V]) Item() *T
- func (r *FindResult[T, V]) OrElse(f func(*T)) *FindResult[T, V]
- func (r *FindResult[T, V]) Stop() *FindResult[T, V]
- func (r *FindResult[T, V]) Then(onFound func(*T, *V), onNotFound func(*T)) *FindResult[T, V]
- func (r *FindResult[T, V]) When(cond bool, f func(*FindResult[T, V])) *FindResult[T, V]
- type IFChainBuilder
- type IFChainBuilderAction
- type IFChainBuilderCondition
- type IfChainer
- type IfValueChainer
- func (ic *IfValueChainer[T]) ElseDo(fn func() T) *IfValueChainer[T]
- func (ic *IfValueChainer[T]) ElseReturn(val T) *IfValueChainer[T]
- func (ic *IfValueChainer[T]) Get() T
- func (ic *IfValueChainer[T]) ThenDo(fn func() T) *IfValueChainer[T]
- func (ic *IfValueChainer[T]) ThenReturn(val T) *IfValueChainer[T]
- type LayeredMerger
- type MapEntry
- type MapMergeOptions
- type MapMergeStrategy
- type Predicate
- type Proba
- type ResultWithError
- type SliceChain
- func (sc *SliceChain[T]) Append(elements ...T) *SliceChain[T]
- func (sc *SliceChain[T]) Data() []T
- func (sc *SliceChain[T]) Filter(f func(T) bool) *SliceChain[T]
- func (sc *SliceChain[T]) RemoveEmpty() *SliceChain[T]
- func (sc *SliceChain[T]) RemoveValue(value T) *SliceChain[T]
- func (sc *SliceChain[T]) Sort(less func(a, b T) bool) *SliceChain[T]
- func (sc *SliceChain[T]) String() string
- func (sc *SliceChain[T]) Uniq() *SliceChain[T]
- type SliceFilter
- func (f *SliceFilter[T]) Condition(preds ...Predicate[T]) *SliceFilter[T]
- func (f *SliceFilter[T]) OnMatch(cb FilterCallback[T]) *SliceFilter[T]
- func (f *SliceFilter[T]) OnNotMatch(cb FilterCallback[T]) *SliceFilter[T]
- func (f *SliceFilter[T]) Result() []T
- func (f *SliceFilter[T]) UseAnd() *SliceFilter[T]
- func (f *SliceFilter[T]) UseCustom(combine func([]bool) bool) *SliceFilter[T]
- func (f *SliceFilter[T]) UseOr() *SliceFilter[T]
- type StatsSummary
- type Unstable
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AddUniqueSlice ¶
func AddUniqueSlice[T comparable](slice []T, items ...T) ([]T, bool)
AddUniqueSlice 向切片中添加元素(如果不存在) 返回新切片和是否实际添加了元素
func AtLeast ¶
AtLeast 返回 x 和 lower 中的最小值 参数: x - 要比较的第一个数值 lower - 要比较的第二个数值(下限) 返回值: 返回 x 和 lower 中的最小值
func AtMost ¶
AtMost 返回 x 和 upper 中的最大值 参数: x - 要比较的第一个数值 upper - 要比较的第二个数值(上限) 返回值: 返回 x 和 upper 中的最大值
func Between ¶
Between 将 x 的值限制在 [lower, upper] 范围内 如果 x 小于 lower,则返回 lower; 如果 x 大于 upper,则返回 upper; 否则,返回 x 本身 参数: x - 要限制的数值 lower - 范围的下限 upper - 范围的上限 返回值: 返回 x 被限制在 [lower, upper] 范围内的值
func BitToArrayBig ¶
BitToArrayBig 将big.Int掩码中所有被置1的位索引提取为数组
func CalcEntropy ¶
CalcEntropy 计算给定概率分布(map)的熵值 熵值表示信息的不确定性或随机性
func Clone ¶
func Clone(value interface{}, seen map[uintptr]interface{}) interface{}
Clone 深拷贝任意类型的值
func CloneMap
deprecated
func CloneMap[K comparable, V any](m map[K]V) map[K]V
CloneMap 深拷贝 map(浅拷贝键值对,不递归复制值引用的对象)
Deprecated: 使用 MapClone 替代,命名风格统一为 MapXxx 迁移示例:
// 旧: cloned := CloneMap(m) // 新: cloned := MapClone(m)
func ContainsAllSlice ¶
func ContainsAllSlice[T comparable](slice []T, items ...T) bool
ContainsAllSlice 检查切片是否包含所有指定元素
func ContainsAnySlice ¶
func ContainsAnySlice[T comparable](slice []T, items ...T) bool
ContainsAnySlice 检查切片是否包含任意一个指定元素
func ConvertMapKeysToString ¶
func ConvertMapKeysToString(data interface{}) interface{}
ConvertMapKeysToString 递归地将 map 的所有键转换为字符串 支持嵌套的 map 和 slice
func CountPathSegments ¶
CountPathSegments 计算路径中指定前缀的参数数量,默认为 ":" 和 "*"
func CountSlice
deprecated
func DedupeValues ¶
func DedupeValues[T any, K comparable](items []T, key func(T) (K, bool)) []K
DedupeValues 从切片中按键提取去重后的值列表 key 函数返回 (值, 是否包含);ok=false 时跳过该项(常用于过滤零值)
func DeepMergeMap ¶
func DeepMergeMap(target, source map[string]interface{}, options *MapMergeOptions) (map[string]interface{}, error)
DeepMergeMap 深度合并两个 map[string]interface{} target: 目标map(会被修改) source: 源map options: 合并选项,nil则使用默认选项 返回合并后的 map 和可能的错误
func DefaultIfNilPtr ¶
func DefaultIfNilPtr[T any](param *T, defaultValue T) *T
DefaultIfNilPtr 如果参数为 nil,返回指向默认值的指针;否则返回原参数 适用于需要保持指针类型的场景,如分页参数、配置对象等
示例:
基础类型示例
var count *int
count = mathx.DefaultIfNilPtr(count, 10)
fmt.Println(*count) // 输出: 10
字符串示例
var name *string
name = mathx.DefaultIfNilPtr(name, "default")
fmt.Println(*name) // 输出: default
结构体示例(分页参数)
var page *PageReq
page = mathx.DefaultIfNilPtr(page, PageReq{Page: 1, PageSize: 10})
page 现在指向默认值
已存在的指针保持原值
existing := &PageReq{Page: 2, PageSize: 20}
result := mathx.DefaultIfNilPtr(existing, PageReq{Page: 1, PageSize: 10})
result == existing (保持原值,Page=2, PageSize=20)
func EqualUnorderedSlice
deprecated
func EqualUnorderedSlice[T comparable](a, b []T) bool
EqualUnorderedSlice 检查两个切片是否包含相同元素(忽略顺序)
Deprecated: 使用 SliceElementsMatch 替代,命名更清晰(elements match) 迁移示例:
// 旧: equal := EqualUnorderedSlice(a, b) // 新: equal := SliceElementsMatch(a, b)
func FilterMap
deprecated
func FilterMap[K comparable, V any](m map[K]V, predicate func(K, V) bool) map[K]V
FilterMap 过滤 map,保留满足条件的键值对
Deprecated: 使用 MapPickBy 替代,命名风格统一为 MapXxx 迁移示例:
// 旧:
result := FilterMap(m, func(k K, v V) bool { return v > 0 })
// 新:
result := MapPickBy(m, func(k K, v V) bool { return v > 0 })
注意:MapPickBy 额外支持自定义 map 类型(~map[K]V),保留原 map 类型
func FilterSlice ¶
FilterSlice 过滤切片,保留满足条件的元素 与 SliceRemove 的区别:FilterSlice 保留满足条件的,SliceRemove 也是保留满足条件的 这个函数提供更直观的命名
func FilterSliceByFunc ¶
FilterSliceByFunc 是一个通用的切片过滤函数。 它接收一个切片 slice 和一个判断函数 predicate, 返回一个新的切片,包含所有满足 predicate 条件的元素。
泛型参数说明:
T 表示切片元素的类型,可以是任意类型。
参数说明:
slice - 输入的切片,类型为 []T。 predicate - 一个函数,接收一个 T 类型元素,返回 bool,表示该元素是否满足条件。
返回值说明:
返回一个新的切片,包含所有满足 predicate 条件的元素,顺序与原切片一致。
示例:
results := []ABC{...}
frontFaces := FilterSliceByFunc(results, func(d ABC) bool {
return d.key == "123"
})
func FindLastSlice ¶
FindLastSlice 查找最后一个满足条件的元素
func FlattenMap ¶
FlattenMap 扁平化嵌套的 map,使用点号分隔键 例如: {"a": {"b": {"c": 1}}} => {"a.b.c": 1}
func FormatPercentage ¶
FormatPercentage 格式化百分比
func FormatRatio ¶
FormatRatio 将 [0,1] 区间的比率格式化为百分比字符串(不带 % 后缀) precision 为小数位数,如 0.855 + precision=2 → "85.50" 内部先乘 100 再格式化,避免外部重复 *100 造成精度损失
func FormatRatioFromCount ¶
FormatRatioFromCount 从 count 直接计算并格式化百分比字符串(不带 % 后缀) 等价于 FormatRatio(Ratio(part, total), precision),但减少一次中间赋值 part 为分子(如 success_count),total 为分母(如 终态订单数),precision 为小数位数
func GetNestedMapValue ¶
GetNestedMapValue 从嵌套的 map 中获取值,支持路径访问 例如: GetNestedMapValue[string](data, "user", "profile", "name")
func GroupSliceBy ¶
func GroupSliceBy[T any, K comparable](slice []T, keyFunc func(T) K) map[K][]T
GroupSliceBy 按照键函数对切片元素分组
func IF ¶
IF 实现三元运算,使用泛型 T 根据布尔条件 condition 返回 trueVal 或 falseVal 作用类似于三元表达式 condition ? trueVal : falseVal
func IfAllEmpty ¶
func IfAllEmpty[T any](values []interface{}, trueVal, falseVal T) T
IfAllEmpty 所有值为空检查三元运算 检查提供的所有值是否都为空 如果全部为空,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfAllEmpty([]interface{}{"", 0, []int{}}, "all empty", "has value") // "all empty"
result := mathx.IfAllEmpty([]interface{}{"", 0, "x"}, "all empty", "has value") // "has value"
func IfAllowedField ¶
IfAllowedField 字段白名单检查三元运算 使用 validator.IsAllowedField 检查字段是否在白名单中 如果允许,返回 trueVal;否则返回 falseVal
示例:
allowed := []string{"id", "name", "email"}
result := mathx.IfAllowedField("name", allowed, "ok", "forbidden") // "ok"
result := mathx.IfAllowedField("password", allowed, "ok", "forbidden") // "forbidden"
func IfCEmpty ¶
func IfCEmpty[T comparable, R any](val T, trueVal, falseVal R) R
IfCEmpty 可比较类型零值检查三元运算 使用 validator.IsCEmpty 检查可比较类型是否为零值 如果为零值,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfCEmpty(0, "is zero", "not zero") // "is zero"
result := mathx.IfCEmpty("", "is empty", "not empty") // "is empty"
result := mathx.IfCEmpty(false, "is false", "is true") // "is false"
func IfCall ¶
IfCall 根据布尔条件 condition,选择性调用对应的回调函数
Params
- condition: 判断条件,true 时调用 onTrue,false 时调用 onFalse
- result: 泛型参数,传递给回调函数的结果值
- err: 错误信息,传递给回调函数
- callbacks: 可变参数,可以传 0-2 个回调函数
- callbacks[0]: onTrue - 条件为 true 时调用
- callbacks[1]: onFalse - 条件为 false 时调用
函数逻辑:
- 根据 condition 选择要调用的回调函数
- 如果回调不为 nil,则调用它
- 支持省略任意回调函数
示例:
完整版本(两个回调)
mathx.IfCall(err != nil, result, err,
func(r T, e error) { onSuccess(r) },
func(r T, e error) { onError(e) },
)
只需要 true 分支
mathx.IfCall(success, data, nil,
func(r T, e error) { log.Info("成功: %v", r) },
)
只需要 false 分支
mathx.IfCall(err != nil, nil, err,
nil,
func(r T, e error) { log.Error("错误: %v", e) },
)
func IfChain ¶
func IfChain[T any](pairs []ConditionValue[T], defaultVal T) T
IfChain 根据传入的 ConditionValue 切片,依次判断每个条件 返回第一个条件为 true 的对应值;如果所有条件均为 false,返回默认值 defaultVal 实现类似 if-else if-else 的多条件链判断,且支持任意泛型类型
示例:
pairs := []ConditionValue[int]{
{Cond: x > 0, Value: 1},
{Cond: x == 0, Value: 0},
{Cond: x < 0, Value: -1},
}
result := IfChain(pairs, 999) // 若都不满足,返回 999
func IfClamp ¶
IfClamp 将值限制在 [min, max] 范围内 如果 val < min,返回 min;如果 val > max,返回 max;否则返回 val
示例:
result := mathx.IfClamp(150, 0, 100) // 返回 100 result := mathx.IfClamp(-10, 0, 100) // 返回 0 result := mathx.IfClamp(50, 0, 100) // 返回 50
func IfContains ¶
func IfContains[T comparable](slice []T, target T, trueVal, falseVal T) T
IfContains 包含检查三元运算 检查 slice 是否包含 target 如果包含,返回 trueVal;否则返回 falseVal
func IfContainsChinese ¶
IfContainsChinese 中文字符检查三元运算 使用 validator.ContainsChinese 检查字符串是否包含中文 如果包含,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfContainsChinese("你好world", "has chinese", "no chinese") // "has chinese"
result := mathx.IfContainsChinese("hello", "has chinese", "no chinese") // "no chinese"
func IfCount ¶
IfCount 计数条件三元运算 统计 conditions 中为 true 的条件数量 如果满足条件的数量 >= threshold,返回 trueVal;否则返回 falseVal
func IfDefaultAndClamp ¶
IfDefaultAndClamp 先应用默认值,再做范围限制 适用于分页等场景,先判断 <=0 用默认值,再限制在[min,max]区间
示例:
pageSize = mathx.IfDefaultAndClamp(pageSize, 10, 1, 100)
func IfDo ¶
IfDo 根据条件 condition 决定是否执行函数 do 并返回结果 如果 condition 为 true,执行 do() 并返回其结果;否则返回默认值 defaultVal
func IfDoAF ¶
IfDoAF 根据条件 condition 决定执行 do 或 defaultFunc 函数并返回结果 如果 condition 为 true,执行 do();否则执行 defaultFunc()
func IfDoAsync ¶
IfDoAsync 支持异步执行延迟函数 do,返回结果的通道 根据条件 condition 决定是否执行 do(),否则返回默认值 defaultVal(可选) 结果通过带缓冲的通道返回,避免阻塞
示例:
提供默认值
ch := mathx.IfDoAsync(needFetch,
func() Data { return fetchData() },
defaultData,
)
不提供默认值(返回零值)
ch := mathx.IfDoAsync(needFetch,
func() Data { return fetchData() },
)
func IfDoAsyncWithTimeout ¶
func IfDoAsyncWithTimeout[T any](condition bool, do DoFunc[T], timeoutMs int, defaultVal ...T) <-chan T
IfDoAsyncWithTimeout 异步执行延迟函数 do,支持超时控制 condition 为 true 时执行 do(),否则返回默认值 defaultVal(可选) timeoutMs 指定超时时间(毫秒),超时则返回类型 T 的零值 返回一个通道,异步获取结果
func IfDoWithError ¶
func IfDoWithError[T any](condition bool, do DoFuncWithError[T], defaultVal T) (T, error)
IfDoWithError 根据条件 condition 执行带错误返回的函数 do 如果 condition 为 true,执行 do() 并返回结果与错误;否则返回默认值 defaultVal 和 nil 错误
func IfDoWithErrorAsync ¶
func IfDoWithErrorAsync[T any](condition bool, do DoFuncWithError[T], defaultVal T) <-chan ResultWithError[T]
IfDoWithErrorAsync 支持异步执行带错误返回的函数 do 根据条件 condition 决定是否执行 do(),否则返回默认值 defaultVal 和 nil 错误 返回一个通道,通道元素是 ResultWithError[T] 类型
func IfDoWithErrorDefault ¶
func IfDoWithErrorDefault[T any](condition bool, do DoFuncWithError[T], defaultVal T) T
IfDoWithErrorDefault 根据条件 condition 执行带错误返回的函数 do 如果 condition 为 false 或 do 返回错误,则返回 defaultVal
func IfElse ¶
IfElse 实现多条件链式判断,安全泛型版本IfE conditions 和 values 长度必须相等,依次判断 conditions 中的条件 返回第一个为 true 的对应 values 元素;如果没有满足条件,返回 defaultVal 适合实现类似 if ... else if ... else 的多分支逻辑
func IfEmpty ¶
func IfEmpty[T any](val T, defaultVal T) T
IfEmpty 空值检查三元运算 使用 validator.IsEmptyValue 检查值是否为空 如果为空,返回 defaultVal;否则返回 val
示例:
result := mathx.IfEmpty("", "default") // "default"
result := mathx.IfEmpty("hello", "default") // "hello"
result := mathx.IfEmpty([]int{}, []int{1,2}) // []int{1,2}
result := mathx.IfEmpty(0, 100) // 100
func IfEmptyDo ¶
IfEmptyDo 空值检查执行函数 如果值为空,执行 do 函数;否则返回 val
示例:
result := mathx.IfEmptyDo("", func() string { return generateDefaultName() })
result := mathx.IfEmptyDo([]int{}, func() []int { return loadDefaultData() })
func IfEmptySlice ¶
IfEmptySlice 空切片检查三元运算 如果切片为空,返回 trueVal;否则返回 falseVal
func IfEq ¶
func IfEq[T comparable, R any](a, b T, trueVal, falseVal R) R
IfEq 等于比较三元运算 如果 a == b,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfEq(5, 5, "equal", "not equal") // "equal" result := mathx.IfEq(5, 3, "equal", "not equal") // "not equal"
func IfErrOrNil ¶
func IfErrOrNil[T comparable, R any](val T, err error, trueVal, falseVal R) R
IfErrOrNil 错误或空值检查 如果 err != nil 或 val 为零值,返回 trueVal;否则返回 falseVal
func IfExec ¶
func IfExec(condition bool, action func())
IfExec 根据条件执行副作用操作(无返回值) 适用于只需要执行代码块,不需要返回值的场景
Params
- condition: 判断条件,true 时执行 action
- action: 条件为 true 时执行的函数
示例:
mathx.IfExec(user != nil, func() {
log.Printf("User: %s", user.Name)
})
func IfExecElse ¶
func IfExecElse(condition bool, onTrue func(), onFalse ...func())
IfExecElse 根据条件执行不同的副作用操作 类似三元运算符,但用于执行代码块而非返回值
Params
- condition: 判断条件
- onTrue: 条件为 true 时执行的函数
- onFalse: 条件为 false 时执行的函数(可选,可以省略或传 nil)
示例:
两个分支都需要
mathx.IfExecElse(err == nil,
func() { log.Info("Success") },
func() { log.Error("Failed: " + err.Error()) },
)
只需要 false 分支(true 分支传 nil)
mathx.IfExecElse(err == nil, nil, func() { log.Error("Failed") })
或者使用可变参数版本,省略第二个参数
mathx.IfExecElse(err == nil, func() { log.Info("Success") })
func IfGe ¶
IfGe 大于等于比较三元运算 如果 a >= b,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfGe(10, 10, "yes", "no") // "yes" result := mathx.IfGe(9, 10, "yes", "no") // "no"
func IfGeZero ¶
IfGeZero 大于等于零时使用默认值 如果 val >= 0,返回 defaultVal;否则返回 val
示例:
config.ErrorCode = mathx.IfGeZero(config.ErrorCode, -1)
func IfGt ¶
IfGt 大于比较三元运算 如果 a > b,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfGt(10, 5, "greater", "not greater") // "greater" result := mathx.IfGt(3, 5, "greater", "not greater") // "not greater"
func IfGtZero ¶
IfGtZero 大于零时使用默认值 如果 val > 0,返回 defaultVal;否则返回 val
示例:
config.MaxSize = mathx.IfGtZero(config.MaxSize, 100)
func IfHasEmpty ¶
func IfHasEmpty[T any](values []interface{}, trueVal, falseVal T) T
IfHasEmpty 包含空值检查三元运算 检查提供的值中是否有空值 如果有空值,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfHasEmpty([]interface{}{"hello", "", "world"}, "has empty", "all filled") // "has empty"
result := mathx.IfHasEmpty([]interface{}{"a", "b", "c"}, "has empty", "all filled") // "all filled"
func IfIPAllowed ¶
IfIPAllowed IP白名单检查三元运算 使用 validator.IsIPAllowed 检查 IP 是否在白名单中 如果允许,返回 trueVal;否则返回 falseVal
示例:
allowList := []string{"192.168.1.0/24", "10.0.0.1"}
result := mathx.IfIPAllowed("192.168.1.100", allowList, "allowed", "denied") // "allowed"
result := mathx.IfIPAllowed("8.8.8.8", allowList, "allowed", "denied") // "denied"
func IfLe ¶
IfLe 小于等于比较三元运算 如果 a <= b,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfLe(5, 5, "yes", "no") // "yes" result := mathx.IfLe(6, 5, "yes", "no") // "no"
func IfLeZero ¶
IfLeZero 小于等于零时使用默认值 如果 val <= 0,返回 defaultVal;否则返回 val 适用于配置参数、超时时间等场景
示例:
config.CleanupInterval = mathx.IfLeZero(config.CleanupInterval, time.Minute*10) config.PageSize = mathx.IfLeZero(config.PageSize, 10) config.Timeout = mathx.IfLeZero(config.Timeout, 30*time.Second)
func IfLenGt ¶
IfLenGt 长度检查三元运算 检查切片长度是否大于指定值
示例:
message := mathx.IfLenGt(availableAgents, 0,
"ABC",
"DEF",
)
func IfLt ¶
IfLt 小于比较三元运算 如果 a < b,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfLt(3, 5, "less", "not less") // "less" result := mathx.IfLt(7, 5, "less", "not less") // "not less"
func IfLtZero ¶
IfLtZero 小于零时使用默认值 如果 val < 0,返回 defaultVal;否则返回 val
示例:
config.MinValue = mathx.IfLtZero(config.MinValue, 10) config.Offset = mathx.IfLtZero(config.Offset, 0)
func IfMapElse ¶
IfMapElse 双向映射三元运算 根据条件选择不同的映射函数 如果 condition 为 true,执行 trueMapper;否则执行 falseMapper(可选) 如果不提供 falseMapper,则 condition=false 时返回 R 类型的零值
示例:
完整版本
output := mathx.IfMapElse(isJSON, data,
func(d Data) string { return d.ToJSON() },
func(d Data) string { return d.ToXML() },
)
简化版本(false 时返回零值)
output := mathx.IfMapElse(needFormat, data,
func(d Data) string { return d.Format() },
)
func IfMemoized ¶
func IfMemoized[T any](condition bool, key string, cache map[string]T, computeFn func() T, defaultVal T) T
IfMemoized 带缓存的三元运算 缓存函数执行结果,避免重复计算 cache 用于存储计算结果
func IfMulti ¶
func IfMulti[T comparable, R any](target T, values []T, trueVal, falseVal R) R
IfMulti 多值比较三元运算 检查 target 是否等于 values 中的任意一个 如果匹配,返回 trueVal;否则返回 falseVal
func IfNe ¶
func IfNe[T comparable, R any](a, b T, trueVal, falseVal R) R
IfNe 不等于比较三元运算 如果 a != b,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfNe(5, 3, "different", "same") // "different" result := mathx.IfNe(5, 5, "different", "same") // "same"
func IfNil ¶
func IfNil[T any](val interface{}, trueVal, falseVal T) T
IfNil Nil检查三元运算 使用 validator.IsNil 检查值是否为 nil 如果为 nil,返回 trueVal;否则返回 falseVal
示例:
var ptr *string result := mathx.IfNil(ptr, "is nil", "not nil") // "is nil" result := mathx.IfNil(&value, "is nil", "not nil") // "not nil" result := mathx.IfNil([]int(nil), "is nil", "not nil") // "is nil"
func IfNotCEmpty ¶
func IfNotCEmpty[T comparable, R any](val T, trueVal, falseVal R) R
IfNotCEmpty 可比较类型非零值检查三元运算 使用 validator.IsCEmpty 检查可比较类型是否非零值 如果非零值,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfNotCEmpty("hello", "has text", "empty") // "has text"
result := mathx.IfNotCEmpty(0, "has value", "zero") // "zero"
func IfNotEmpty ¶
IfNotEmpty 空字符串检查三元运算 如果字符串非空,返回原字符串;否则返回默认值
func IfNotEmptyValue ¶
func IfNotEmptyValue[T any](val T, defaultVal T) T
IfNotEmptyValue 非空值检查三元运算 使用 validator.IsEmptyValue 检查值是否非空 如果非空,返回 val;否则返回 defaultVal
示例:
result := mathx.IfNotEmptyValue("hello", "default") // "hello"
result := mathx.IfNotEmptyValue("", "default") // "default"
result := mathx.IfNotEmptyValue([]int{1}, []int{}) // []int{1}
func IfNotNil ¶
func IfNotNil[T any](val *T, defaultVal T) T
IfNotNil 空值检查三元运算 如果 val 不为 nil,返回 val;否则返回 defaultVal 适用于指针类型的空值检查
func IfNotNilValue ¶
func IfNotNilValue[T any](val interface{}, trueVal, falseVal T) T
IfNotNilValue 非Nil检查三元运算 使用 validator.IsNil 检查值是否非 nil 如果非 nil,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfNotNilValue(&value, "has value", "no value") // "has value" result := mathx.IfNotNilValue(nil, "has value", "no value") // "no value"
func IfNotZero ¶
func IfNotZero[T comparable](val T, defaultVal T) T
IfNotZero 零值检查三元运算 如果值不为类型零值,返回原值;否则返回默认值 支持任意可比较类型
func IfNull ¶
IfNull "null"字符串检查三元运算 使用 validator.IsNull 检查字符串是否为 "null" 如果是,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfNull("null", "is null", "not null") // "is null"
result := mathx.IfNull("undefined", "is null", "not null") // "not null"
func IfNullOrUndefined ¶
IfNullOrUndefined "null"或"undefined"字符串检查三元运算 同时支持 "null" 和 "undefined" 字符串 如果是其中之一,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfNullOrUndefined("null", "empty", "not empty") // "empty"
result := mathx.IfNullOrUndefined("undefined", "empty", "not empty") // "empty"
result := mathx.IfNullOrUndefined("hello", "empty", "not empty") // "not empty"
func IfPipeline ¶
IfPipeline 管道式三元运算 如果 condition 为 true,依次执行 funcs 中的函数 每个函数的输出作为下一个函数的输入 如果 condition 为 false,返回 defaultVal
func IfSafeFieldName ¶
IfSafeFieldName 字段名安全检查三元运算 使用 validator.IsSafeFieldName 检查字段名是否安全 如果安全,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfSafeFieldName("user_name", "safe", "unsafe") // "safe"
result := mathx.IfSafeFieldName("user'; DROP TABLE", "safe", "unsafe") // "unsafe"
func IfSafeIndex ¶
IfSafeIndex 安全索引访问三元运算 安全地访问 slice 的指定索引 如果索引有效,返回对应元素;否则返回 defaultVal
func IfSafeKey ¶
func IfSafeKey[K comparable, V any](m map[K]V, key K, defaultVal V) V
IfSafeKey 安全键访问三元运算 安全地访问 map 的指定键 如果键存在,返回对应值;否则返回 defaultVal
func IfStrFmt ¶
func IfStrFmt(condition bool, trueFormat string, trueArgs []any, falseFormat string, falseArgs []any) (string, []any)
IfStrFmt 条件格式化字符串选择 根据条件选择不同的格式化字符串和参数
示例:
format, args := mathx.IfStrFmt(err != nil,
" - %s: 获取负载失败 (%v)", []any{agentID, err},
" - %s: %d 个工单", []any{agentID, workload},
)
logger.InfoContext(ctx, format, args...)
func IfSwitch ¶
func IfSwitch[K comparable, V any](key K, cases map[K]V, defaultVal V) V
IfSwitch 开关式三元运算 根据 key 从 cases 映射中查找对应值 如果找到,返回对应值;否则返回 defaultVal
func IfTryParse ¶
IfTryParse 尝试解析三元运算 使用 parser 函数尝试解析 input 如果解析成功(无错误),返回解析结果;否则返回 defaultVal
func IfUndefined ¶
IfUndefined "undefined"字符串检查三元运算 使用 validator.IsUndefined 检查字符串是否为 "undefined" 如果是,返回 trueVal;否则返回 falseVal
示例:
result := mathx.IfUndefined("undefined", "is undef", "defined") // "is undef"
result := mathx.IfUndefined("null", "is undef", "defined") // "defined"
func IfValidate ¶
IfValidate 验证三元运算 使用验证函数检查值,根据验证结果返回不同值 如果验证通过,返回 validVal;否则返回 invalidVal
func IndexOfSlice ¶
func IndexOfSlice[T comparable](slice []T, item T) int
IndexOfSlice 返回元素在切片中的索引,不存在返回 -1
func LastIndexOfSlice ¶
func LastIndexOfSlice[T comparable](slice []T, item T) int
LastIndexOfSlice 返回元素在切片中最后一次出现的索引,不存在返回 -1
func LongestCommonPrefix ¶
LongestCommonPrefix 返回两个字符串的最长公共前缀的长度 参数: a - 第一个字符串 b - 第二个字符串 返回值: 返回两个字符串的最长公共前缀的长度
func MapAssign ¶
func MapAssign[K comparable, V any, M ~map[K]V](maps ...M) M
MapAssign 从左到右合并多个 map,后者覆盖前者 与 ShallowMergeMap 区别:ShallowMergeMap 接收可变参数 map[K]V, MapAssign 接收自定义 map 类型 M(~map[K]V)保持类型
func MapClone ¶
func MapClone[K comparable, V any](m map[K]V) map[K]V
MapClone 浅拷贝 map 的键值对(不递归复制值引用的对象) 与 CloneMap 功能等价,命名遵循 MapXxx 风格
func MapFilterKeys ¶
func MapFilterKeys[K comparable, V any](in map[K]V, predicate func(key K, value V) bool) []K
MapFilterKeys 按 predicate 过滤,返回满足条件的键切片(Filter + Keys 组合)
func MapFilterToSlice ¶
func MapFilterToSlice[K comparable, V any, R any](in map[K]V, iteratee func(key K, value V) (R, bool)) []R
MapFilterToSlice 过滤+转换 map 到切片 iteratee 返回 (结果, 是否保留),仅保留的元素进入切片
func MapFilterValues ¶
func MapFilterValues[K comparable, V any](in map[K]V, predicate func(key K, value V) bool) []V
MapFilterValues 按 predicate 过滤,返回满足条件的值切片(Filter + Values 组合)
func MapFromEntries ¶
func MapFromEntries[K comparable, V any](entries []MapEntry[K, V]) map[K]V
MapFromEntries 将键值对切片转为 map(同 key 后者覆盖前者)
func MapInvert ¶
func MapInvert[K, V comparable](in map[K]V) map[V]K
MapInvert 反转 map 的键和值(V 必须可比较) 若有重复值,后者覆盖前者
func MapKeys ¶
func MapKeys[K comparable, V any](in ...map[K]V) []K
MapKeys 提取一个或多个 map 的所有键,返回切片 支持多个 map,键来自所有 map 的并集(不去重,见 MapUniqKeys 去重版本)
func MapMapEntries ¶
func MapMapEntries[K1 comparable, V1 any, K2 comparable, V2 any](in map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2
MapMapEntries 同时转换 key 和 value,返回新类型的 map
func MapMapKeys ¶
func MapMapKeys[K comparable, V any, R comparable](in map[K]V, iteratee func(value V, key K) R) map[R]V
MapMapKeys 转换所有键,返回新 map(值类型不变)
func MapMapValues ¶
func MapMapValues[K comparable, V any, R any](in map[K]V, iteratee func(value V, key K) R) map[K]R
MapMapValues 转换所有值,返回新 map(键类型不变) 与 TransformMapValues 区别:TransformMapValues 只接收 value,本方法接收 (value, key)
func MapOmitBy ¶
func MapOmitBy[K comparable, V any, M ~map[K]V](in M, predicate func(key K, value V) bool) M
MapOmitBy 按 predicate 过滤,移除满足条件的键值对(与 PickBy 相反)
func MapOmitByKeys ¶
func MapOmitByKeys[K comparable, V any, M ~map[K]V](in M, keys []K) M
MapOmitByKeys 按键列表过滤,移除 keys 中存在的键
func MapOmitByValues ¶
func MapOmitByValues[K, V comparable, M ~map[K]V](in M, values []V) M
MapOmitByValues 按值列表过滤,移除 values 中存在的值(V 必须可比较)
func MapPickBy ¶
func MapPickBy[K comparable, V any, M ~map[K]V](in M, predicate func(key K, value V) bool) M
MapPickBy 按 predicate 过滤,保留满足条件的键值对,返回同类型 map
func MapPickByKeys ¶
func MapPickByKeys[K comparable, V any, M ~map[K]V](in M, keys []K) M
MapPickByKeys 按键列表过滤,仅保留 keys 中存在的键
func MapPickByValues ¶
func MapPickByValues[K, V comparable, M ~map[K]V](in M, values []V) M
MapPickByValues 按值列表过滤,仅保留 values 中存在的值(V 必须可比较)
func MapSliceByKey ¶
func MapSliceByKey[T any, K comparable](slice []T, keyFunc func(T) K) map[K]T
MapSliceByKey 将一个切片 slice 转换为一个 map, 键由 keyFunc 从切片元素中提取,值为对应的切片元素。
泛型参数说明:
T - 切片元素的类型,支持任意类型。
K - map 的键类型,必须是可比较类型(comparable),
这是 Go map 键的要求。
参数说明:
slice - 输入的切片,类型为 []T。 keyFunc - 函数,接收一个 T 类型元素,返回对应的键 K。
返回值说明:
返回一个 map[K]T,键是 keyFunc 生成的键,值是对应的切片元素。 如果 slice 中有重复的键,后出现的元素会覆盖前面的。
例子:
users := []User{{ID:1, Name:"A"}, {ID:2, Name:"B"}}
userMap := MapSliceByKey(users, func(u User) int { return u.ID })
userMap[1] == User{ID:1, Name:"A"}
func MapToSlice ¶
func MapToSlice[K comparable, V any, R any](in map[K]V, iteratee func(key K, value V) R) []R
MapToSlice 将 map 转为切片,iteratee 接收 (key, value) 返回结果元素
func MapUniqKeys ¶
func MapUniqKeys[K comparable, V any](in ...map[K]V) []K
MapUniqKeys 提取一个或多个 map 的所有去重键
func MapUniqValues ¶
func MapUniqValues[K, V comparable](in ...map[K]V) []V
MapUniqValues 提取一个或多个 map 的所有去重值(V 必须可比较)
func MapValueOr ¶
func MapValueOr[K comparable, V any](in map[K]V, key K, fallback V) V
MapValueOr 返回键对应的值或 fallback
func MapValues ¶
func MapValues[K comparable, V any](in ...map[K]V) []V
MapValues 提取一个或多个 map 的所有值,返回切片
func MarshalJSONOrDefault ¶
MarshalJSONOrDefault 将任意值序列化为 JSON 字符串,失败或空值时返回默认值 适用于需要确保 JSON 字段不为空的场景(如 MySQL JSON 列)
参数:
- value: 待序列化的值(可以是 map、struct、slice 等任意类型)
- defaultVal: 序列化失败或值为空时返回的默认值(通常为 "{}" 或 "[]")
返回:
- JSON 字符串或默认值
示例:
map[string]string 序列化
extra := map[string]string{"key": "value"}
json := mathx.MarshalJSONOrDefault(extra, "{}") // 返回 {"key":"value"}
空 map 返回默认值
empty := map[string]string{}
json := mathx.MarshalJSONOrDefault(empty, "{}") // 返回 {}
nil 值返回默认值
json := mathx.MarshalJSONOrDefault(nil, "{}") // 返回 {}
序列化失败返回默认值
invalid := make(chan int) // channel 不能序列化
json := mathx.MarshalJSONOrDefault(invalid, "{}") // 返回 {}
func MergeLayeredKeyValues ¶
func MergeLayeredKeyValues[T any, KV any]( layers []*T, fieldGetter func(*T) []KV, keyFieldName string, valueFieldName string, ) []KV
MergeLayeredKeyValues 多层级键值对合并工具(支持传入任意数量的配置层级)
参数:
- layers: 配置层级切片,从低到高优先级(越靠后优先级越高,后面的会覆盖前面的)
- fieldGetter: 从配置对象中提取键值对切片的函数
- keyFieldName: 键值对结构中 key 字段的名称(如 "Key")
- valueFieldName: 键值对结构中 value 字段的名称(如 "Value")
返回:合并后的键值对切片,保持 key 首次出现的顺序
特性:
- 支持任意层级的链式合并
- 自动跳过 nil 层级
- 自动跳过空值(值为空字符串的项不会覆盖已有值)
- 保持 key 的首次出现顺序
- 使用反射自动提取字段,支持任意结构体
示例:
type LocalizedText struct {
Key string
Value string
}
type Config struct {
Messages []LocalizedText
}
result := MergeLayeredKeyValues(
[]*Config{hardcodedDefault, ownerConfig, agentConfig},
func(c *Config) []LocalizedText { return c.Messages },
"Key",
"Value",
)
func MergeLayeredScalar ¶
MergeLayeredScalar 多层级标量字段合并,从高优先级层取第一个非零值
参数:
- layers: 配置层级切片,从低到高优先级(越靠后优先级越高)
- fieldGetter: 从配置对象中提取标量值的函数
返回:第一个非零值,若全为零值则返回零值
示例:
timeout := MergeLayeredScalar(layers, func(c *Config) int32 { return c.Timeout })
ratio := MergeLayeredScalar(layers, func(c *Config) float64 { return c.Ratio })
func MinSlice ¶
MinSlice 返回切片中的最小值 Deprecated: 使用 SliceMinOrdered 替代,支持所有 Ordered 类型(int/float/string 等)
func ParseInt64 ¶
ParseInt64 将字符串解析为int64 支持常见的字符串到int64的转换,解析失败时返回错误
func PartitionSlice ¶
PartitionSlice 将切片分为两部分:满足条件的和不满足条件的
func Percentile ¶
Percentile 计算百分位数(支持50, 90, 95, 99)
func Percentiles ¶
Percentiles 批量计算多个百分位数
func Ratio ¶
Ratio 计算比率,返回 [0,1] 区间的小数 part 为分子,total 为分母;total 为 0 时返回 0(避免除零) 与 Percentage 的区别:Percentage 返回 [0,100],Ratio 返回 [0,1] 适用于"终态订单数 = success+failed+cancelled"作为分母的率计算
func RatioRound ¶
RatioRound 计算比率并四舍五入保留 precision 位小数,分母为 0 时返回 0 适用于金额/计数等 int64 指标的安全占比计算,避免结果带浮点尾差
func ReduceSlice ¶
ReduceSlice 将切片归约为单个值
func RepeatField ¶
RepeatField 返回一个长度为 count 的切片, 切片中的每个元素都是传入的 field 值的副本
func ReturnIfErr ¶
ReturnIfErr 简化错误检查和返回 如果 err 不为 nil,返回 T 类型的零值和 err;否则返回 val 和 nil
func SafeGetIndexOrDefault ¶
SafeGetIndexOrDefault 安全获取切片指定索引元素,索引越界时返回指定默认值
func SafeGetIndexOrDefaultNoSpace ¶
SafeGetIndexOrDefaultNoSpace 安全获取字符串切片指定索引元素,索引越界时返回默认值,且结果去除所有空格
func SafeGetIndexWithErr ¶
SafeGetIndexWithErr 安全获取切片指定索引的元素 支持任意类型切片,避免索引越界导致 panic 如果索引合法,返回对应元素和 nil 错误;否则返回类型零值和错误
参数:
slice - 目标切片,支持任意类型 []T index - 需要获取的元素索引,0-based
返回:
T - 索引对应的元素,索引越界时返回类型零值 error - 发生错误时返回详细错误信息,否则为 nil
示例:
val, _ := SafeGetIndexWithErr([]string{"a", "b", "c"}, 1)
fmt.Println(val) // 输出: b
func SetNestedMapValue ¶
SetNestedMapValue 在嵌套的 map 中设置值,如果路径不存在则创建 例如: SetNestedMapValue(data, "John", "user", "profile", "name")
func ShallowMergeMap
deprecated
func ShallowMergeMap[K comparable, V any](maps ...map[K]V) map[K]V
ShallowMergeMap 浅合并多个map(不递归) 使用泛型,支持任意可比较的键类型
Deprecated: 使用 MapAssign 替代,命名风格统一为 MapXxx 迁移示例:
// 旧: result := ShallowMergeMap(m1, m2, m3) // 新: result := MapAssign(m1, m2, m3)
注意:MapAssign 额外支持自定义 map 类型(~map[K]V),保留原 map 类型
func SliceChunk ¶
SliceChunk 将一个切片分割成多个子切片 size 参数指定每个子切片的大小 返回一个包含子切片的切片
func SliceContains
deprecated
SliceContains 检查切片中是否包含某个元素
Deprecated: 使用 SliceContainsComparable 替代,支持所有 comparable 类型 (types.Ordered 是 comparable 的子集,SliceContainsComparable 涵盖其全部用例) 迁移示例:
// 旧: ok := SliceContains(slice, element) // 新: ok := SliceContainsComparable(slice, element)
func SliceContainsComparable ¶
func SliceContainsComparable[T comparable](slice []T, element T) bool
SliceContainsComparable 检查切片中是否包含某个元素(支持 comparable 类型) 适用于枚举、字符串、结构体等任意 comparable 类型
一律线性查找,零分配
原先按长度分流:超过 1000 条就先把整个切片灌进 map 再查一次 那条分支在任何情况下都更慢,包括它本想优化的最坏情况(元素不存在或在末尾)—— 线性扫描是 n 次比较,建 map 是 n 次插入,后者单次成本高出一个量级, 而「O(1) 查找」只省下最后那一次比较 实测(Apple M4,元素不存在):
规模 线性 哈希 1000 232.7 ns / 0 B 7141 ns / 36 KB / 5 allocs 20000 4546 ns / 0 B 182821 ns / 591 KB / 65 allocs 200000 45520 ns / 0 B 2096300 ns / 4.7 MB / 513 allocs
map 只在同一切片上反复查找时才划算,而本函数每次调用都要重建它, 调用方若要多次查找,应当自己建一次集合复用
[EN] Always a linear scan, with no allocation. The length-based split that loaded slices over 1000 elements into a map first was slower in every case, including the worst case it meant to improve: a linear scan is n comparisons while building the map is n insertions, each an order of magnitude dearer, and the O(1) lookup only saves the final comparison. A map pays off only across repeated lookups on the same slice, which this function cannot do since it rebuilds one per call; callers needing many lookups should build a set once themselves
func SliceCountBy ¶
SliceCountBy 按条件计数
func SliceCountValues ¶
func SliceCountValues[T comparable](collection []T) map[T]int
SliceCountValues 按值计数,返回 map[值]出现次数
func SliceCountValuesBy ¶
func SliceCountValuesBy[T any, U comparable](collection []T, mapper func(item T) U) map[U]int
SliceCountValuesBy 按键计数,等价于 Map + CountValues
func SliceCut ¶
func SliceCut[T comparable, Slice ~[]T](collection, separator Slice) (before, after Slice, found bool)
SliceCut 围绕第一个 separator 切割,返回前/后两段及是否找到 separator 为空时返回 (空, collection, true)
func SliceDiff
deprecated
func SliceDiff[T ~[]E, E comparable](list1 T, list2 T) (ret1 T, ret2 T)
SliceDiff 返回两个集合之间的差异
Deprecated: 使用 SliceDifference 替代,语义更清晰 迁移示例:
// 旧: left, right := SliceDiff(list1, list2) // 新: left, right := SliceDifference(list1, list2)
func SliceDiffSetSorted ¶
SliceDiffSetSorted 计算两个已排序数组的对称差集(symmetric difference) 返回仅在其中一个数组中出现的元素(保持有序,自动去重)
算法:双指针一次遍历,O(n+m) 时间复杂度
- arr1[i] < arr2[j]: arr1[i] 仅在 arr1 中,加入结果,i++
- arr1[i] > arr2[j]: arr2[j] 仅在 arr2 中,加入结果,j++
- 相等: 同时出现在两边,跳过,i++, j++
- 自动跳过各自数组内的重复元素(set 语义)
注意:输入必须已排序,否则结果不正确
func SliceDifference ¶
func SliceDifference[T comparable, Slice ~[]T](list1, list2 Slice) (Slice, Slice)
SliceDifference 双向差集,返回 (list1有而list2无, list2有而list1无)
func SliceDropRightWhile ¶
SliceDropRightWhile 从末尾丢弃满足条件的元素,直到遇到第一个不满足的
func SliceDropWhile ¶
SliceDropWhile 从开头丢弃满足条件的元素,直到遇到第一个不满足的
func SliceElementsMatch ¶
func SliceElementsMatch[T comparable](list1, list2 []T) bool
SliceElementsMatch 检查两切片是否包含相同元素集合(忽略顺序,含重复计数)
func SliceFilterMap ¶
SliceFilterMap 过滤+映射组合 回调返回 (映射值, 是否保留),与 TransformAndFilterSlice 等价但参数顺序更直观
func SliceFilterToMap ¶
func SliceFilterToMap[T any, K comparable, V any](collection []T, transform func(item T, index int) (K, V, bool)) map[K]V
SliceFilterToMap 过滤后转 map 回调返回 (key, value, 是否保留),仅保留的元素进入 map
func SliceFindDuplicates ¶
func SliceFindDuplicates[T comparable, Slice ~[]T](collection Slice) Slice
SliceFindDuplicates 返回每个重复元素的首次出现(保持原顺序)
func SliceFindDuplicatesBy ¶
func SliceFindDuplicatesBy[T any, U comparable, Slice ~[]T](collection Slice, iteratee func(item T) U) Slice
SliceFindDuplicatesBy 按键函数返回每个重复元素的首次出现
func SliceFindUniques ¶
func SliceFindUniques[T comparable, Slice ~[]T](collection Slice) Slice
SliceFindUniques 返回只出现一次的元素(保持原顺序)
func SliceFindUniquesBy ¶
func SliceFindUniquesBy[T any, U comparable, Slice ~[]T](collection Slice, iteratee func(item T) U) Slice
SliceFindUniquesBy 按键函数返回只出现一次的元素
func SliceFirstOr ¶
func SliceFirstOr[T any](collection []T, fallback T) T
SliceFirstOr 返回首个元素或 fallback
func SliceFisherYates ¶
func SliceFisherYates[T comparable](slice []T, maxRetries int) error
SliceFisherYates 洗牌算法打乱数组
func SliceFlatMap ¶
SliceFlatMap 映射并展平,一次遍历完成 Map+Flatten iteratee 返回切片,所有返回切片被展平到一个结果切片
func SliceForEachWhile ¶
SliceForEachWhile 可中断遍历 iteratee 返回 false 时中断遍历(类似 do-while)
func SliceGroupByMap ¶
func SliceGroupByMap[T any, K comparable, V any](collection []T, iteratee func(item T) (K, V)) map[K][]V
SliceGroupByMap 按键函数分组,返回 map[key][]value 与 GroupSliceBy 区别:value 类型可与原元素不同(iteratee 同时提取 key 和 value)
func SliceHasDuplicates ¶
func SliceHasDuplicates[T comparable](slice []T) bool
SliceHasDuplicates 检查切片中是否存在重复元素
算法:单次遍历 + map 记录已见元素,O(n) 时间 O(n) 空间
- map 查找/插入平均 O(1),比 goroutine + mutex 方案更快(无锁竞争、无 goroutine 启动开销)
- 发现第一个重复立即返回,避免完整遍历
修复说明:原实现用 goroutine 分块处理,存在三个问题:
- 跨 chunk 的重复检测不到(每个 goroutine 只检查自己 chunk 内的重复)
- 共享 map 写入有 race(len(m) 读取未加锁)
- 小切片 goroutine 启动开销远大于直接计算
预分配到整个切片长度是刻意的,不要「顺手改掉」
看上去它抵消了提前退出的收益——重复出现在第 101 个元素时,仍为两万个槽位 付了钱实测过三种写法(Apple M4,两万个 int):
形状 预分配 不给提示 上限 1024 第101个重复 44669 ns / 591 KB 2301 ns / 4.4 KB 3217 ns / 37 KB 最后一个重复 244265 ns / 591 KB 601343 ns / 1183 KB 576321 ns / 1145 KB 无重复 243984 ns / 591 KB 598450 ns / 1183 KB 578225 ns / 1145 KB
没有普遍更优的选择:提前退出的场景不给提示快 19 倍,而要扫完全程的场景 预分配快 2.5 倍且内存只要一半(后者的代价是 map 从小长到两万要反复 rehash) 本函数的典型用途是校验输入「有重复就拒绝」,合法数据里没有重复, 因此扫完全程才是常态,按它来取舍 调用方若明知多半有重复且只关心有无,自己用不给提示的 map 更划算
[EN] Pre-sizing to the full length is deliberate. It looks as though it cancels the early exit, and three variants were measured: with no size hint an early duplicate is 19x faster, but a full scan is 2.5x slower and uses twice the memory, since the map has to rehash its way up from nothing. This function is typically used to validate input and reject duplicates, so valid data has none and the full scan is the common case; the trade follows that
func SliceHasPrefix ¶
func SliceHasPrefix[T comparable](collection, prefix []T) bool
SliceHasPrefix 检查切片是否以 prefix 开头
func SliceHasSuffix ¶
func SliceHasSuffix[T comparable](collection, suffix []T) bool
SliceHasSuffix 检查切片是否以 suffix 结尾
func SliceInterleave ¶
func SliceInterleave[T any, Slice ~[]T](collections ...Slice) Slice
SliceInterleave 交替合并多个切片 round-robin 交替从每个切片取元素,依次追加到结果 例:[1,2,3], [4,5], [6,7,8,9] => [1,4,6,2,5,7,3,8,9]
func SliceIntersect ¶
func SliceIntersect[T ~[]E, E comparable](list1 T, list2 T) T
SliceIntersect 返回两个集合的交集
func SliceIsSorted ¶
SliceIsSorted 检查切片是否按升序排列
func SliceIsSortedByKey ¶
SliceIsSortedByKey 检查切片是否按键函数升序排列
func SliceLastOr ¶
func SliceLastOr[T any](collection []T, fallback T) T
SliceLastOr 返回末尾元素或 fallback
func SliceMaxBy ¶
SliceMaxBy 自定义比较的最大值,comparison(a,b) 返回 true 表示 a>b
func SliceMaxIndexBy ¶
SliceMaxIndexBy 自定义比较的最大值及其索引
func SliceMaxOrdered ¶
SliceMaxOrdered 返回 Ordered 类型切片的最大值(空切片返回零值)
func SliceMinBy ¶
SliceMinBy 自定义比较的最小值,comparison(a,b) 返回 true 表示 a<b
func SliceMinIndexBy ¶
SliceMinIndexBy 自定义比较的最小值及其索引
func SliceMinMax ¶
func SliceMinMax[T types.Numerical](list []T, f types.MinMaxFunc[T]) (T, error)
SliceMinMax 计算列表中元素的最小值或最大值 接收一个切片和一个 MinMaxFunc 类型的函数, 根据提供的函数决定是计算最小值还是最大值 如果列表为空,则返回错误
func SliceMinOrdered ¶
SliceMinOrdered 返回 Ordered 类型切片的最小值(空切片返回零值)
func SliceNthOr ¶
SliceNthOr 返回第 nth 个元素或 fallback(越界不报错)
func SlicePartitionBy ¶
func SlicePartitionBy[T any, K comparable, Slice ~[]T](collection Slice, iteratee func(item T) K) []Slice
SlicePartitionBy 按键函数分区,返回各分区切片(保持首次出现顺序) 与 PartitionSlice 区别:PartitionBy 返回 []Slice,键由 iteratee 决定
func SliceReject ¶
SliceReject 反向过滤,保留不满足条件的元素(与 FilterSlice 相反)
func SliceRemove
deprecated
SliceRemove 根据给定的条件函数保留切片中的元素
Deprecated: 使用 FilterSlice 替代,命名更符合通用约定(filter = 保留满足条件的) 迁移示例:
// 旧:
result := SliceRemove(arr, func(v T) bool { return v > 0 })
// 新:
result := FilterSlice(arr, func(v T) bool { return v > 0 })
注意:原 SliceRemove 命名有歧义(实际是保留满足条件的,而非移除),FilterSlice 命名更清晰
func SliceRemoveDuplicates
deprecated
func SliceRemoveDuplicates[T comparable](numbers []T) []T
SliceRemoveDuplicates 移除切片中的重复值
Deprecated: 使用 SliceUniq 替代,命名更简洁,语义更清晰 迁移示例:
// 旧: uniq := SliceRemoveDuplicates(numbers) // 新: uniq := SliceUniq(numbers)
func SliceRemoveEmpty ¶
func SliceRemoveEmpty[T any](slice []T) []T
SliceRemoveEmpty 移除切片中的"空"元素(零值或 nil)
适用于元素类型不可比较(如含 slice/map 字段的结构体)的场景 对于 comparable 类型,优先使用 CompactSlice(用 == 比较零值,无反射开销)
性能:使用 reflect.ValueOf(v).IsZero() 直接判断,比 validator.IsEmptyValue 少一层封装
func SliceRemoveValue
deprecated
func SliceRemoveValue[T comparable, Slice ~[]T](arr Slice, value T) Slice
SliceRemoveValue 移除切片中的指定值
Deprecated: 使用 SliceWithout 替代,支持多值排除 迁移示例:
// 旧: result := SliceRemoveValue(arr, value) // 新: result := SliceWithout(arr, value)
注意:SliceWithout 支持变参排除多个值:SliceWithout(arr, v1, v2, v3)
func SliceRemoveZero
deprecated
func SliceRemoveZero[T comparable](arr []T) []T
SliceRemoveZero 移除切片中的零值
Deprecated: 使用 CompactSlice 替代,命名更简洁(compact = 移除零值) 迁移示例:
// 旧: result := SliceRemoveZero(arr) // 新: result := CompactSlice(arr)
func SliceReplace ¶
func SliceReplace[T comparable, Slice ~[]T](collection Slice, old, nEw T, n int) Slice
SliceReplace 返回副本,将前 n 个 old 替换为 nEw(n<0 表示全部替换)
func SliceReplaceAll ¶
func SliceReplaceAll[T comparable, Slice ~[]T](collection Slice, old, nEw T) Slice
SliceReplaceAll 返回副本,将所有 old 替换为 nEw
func SliceSubset ¶
SliceSubset 返回从 offset 开始最多 length 个元素的子切片 offset 为负表示从末尾倒数;不 panic,越界返回空切片
func SliceTimes ¶
SliceTimes 生成 N 个元素 调用 iteratee n 次,返回结果切片(iteratee 接收索引作为参数)
func SliceToMap ¶
func SliceToMap[T any, K comparable](collection []T, iteratee func(item T) K) map[K]T
SliceToMap 切片转 map(KeyBy) iteratee 返回 key,value 为原元素;同 key 后者覆盖前者
func SliceUnion
deprecated
func SliceUnion[T comparable](arr1, arr2 []T) []T
SliceUnion 计算两个数组的并集
Deprecated: 使用 SliceUnionMulti 替代,支持变参多个切片且保持首次出现顺序 迁移示例:
// 旧: union := SliceUnion(arr1, arr2) // 新: union := SliceUnionMulti(arr1, arr2)
注意:SliceUnionMulti 保持首次出现顺序,SliceUnion 不保证顺序(map 遍历)
func SliceUnionMulti ¶
func SliceUnionMulti[T comparable, Slice ~[]T](lists ...Slice) Slice
SliceUnionMulti 多个切片的并集(去重,保持首次出现顺序) 与 SliceUnion 区别:支持变参多个切片
func SliceUniqMap ¶
func SliceUniqMap[T any, R comparable](collection []T, iteratee func(item T, index int) R) []R
SliceUniqMap 转换并去重,一次遍历完成 Map+Uniq 相比分别调用 TransformSlice + SliceRemoveDuplicates 减少一次中间切片分配
func SliceWithout ¶
func SliceWithout[T ~[]E, E comparable](list T, exclude ...E) T
SliceWithout 返回不包括所有给定值的切片
func SliceWithoutBy ¶
func SliceWithoutBy[T any, K comparable, Slice ~[]T](collection Slice, iteratee func(item T) K, exclude ...K) Slice
SliceWithoutBy 按键排除元素 排除 iteratee(item) 结果在 exclude 列表中的元素
func SortByCount ¶
SortByCount 按计数排序统计数据(降序)
func SortByKeyDesc ¶
SortByKeyDesc 按键排序统计数据(降序)- 支持任意可比较类型
func SortByKeyDescUnique ¶
func SortByKeyDescUnique[T any, K cmp.Ordered, ID comparable](items []T, getKey func(T) K, getID func(T) ID) []T
SortByKeyDescUnique 按键排序统计数据(降序)并去重 去重规则:保留每个唯一标识的第一个元素(即排序后权重最大的) getKey: 用于排序的键提取函数 getID: 用于去重的唯一标识提取函数
func TransformAndCompactSlice ¶
func TransformAndCompactSlice[T any, R comparable](slice []T, transform func(T) R) []R
TransformAndCompactSlice 转换切片并移除零值 这是常见的模式:转换后过滤掉零值元素
参数:
- slice: 输入切片
- transform: 转换函数
返回:
- 转换后移除零值的切片
示例:
clients := []*Client{...}
ips := TransformAndCompactSlice(clients, func(c *Client) string { return getIP(c) })
func TransformAndFilterSlice
deprecated
func TransformAndFilterSlice[T any, R any](slice []T, transform func(T) R, predicate func(R) bool) []R
TransformAndFilterSlice 组合转换和过滤操作
Deprecated: 使用 SliceFilterMap 替代,单次回调更简洁,避免中间切片分配 迁移示例:
// 旧:
result := TransformAndFilterSlice(slice,
func(v T) R { return transform(v) },
func(r R) bool { return r != zero })
// 新:
result := SliceFilterMap(slice, func(v T, _ int) (R, bool) {
r := transform(v)
return r, r != zero
})
注意:SliceFilterMap 回调接收 (item, index),TransformAndFilterSlice 只接收 item
func TransformMapKeys
deprecated
func TransformMapKeys[K comparable, V any, R comparable](m map[K]V, transform func(K) R) map[R]V
TransformMapKeys 转换 map 的所有键
Deprecated: 使用 MapMapKeys 替代,回调接收 (value, key) 提供更完整上下文 迁移示例:
// 旧:
result := TransformMapKeys(m, func(k K) R { return f(k) })
// 新:
result := MapMapKeys(m, func(_ V, k K) R { return f(k) })
注意:MapMapKeys 回调签名为 (value, key),可忽略 value 实现等价功能
func TransformMapValues
deprecated
func TransformMapValues[K comparable, V any, R any](m map[K]V, transform func(V) R) map[K]R
TransformMapValues 转换 map 的所有值
Deprecated: 使用 MapMapValues 替代,回调接收 (value, key) 提供更完整上下文 迁移示例:
// 旧:
result := TransformMapValues(m, func(v V) R { return f(v) })
// 新:
result := MapMapValues(m, func(v V, _ K) R { return f(v) })
注意:MapMapValues 回调签名为 (value, key),可忽略 key 实现等价功能
func TransformSlice ¶
TransformSlice 将切片的每个元素通过函数转换为新类型 使用泛型支持任意类型转换,如 []int -> []string
func UnflattenMap ¶
UnflattenMap 将扁平化的 map 还原为嵌套结构 例如: {"a.b.c": 1} => {"a": {"b": {"c": 1}}}
func UniqueSliceBy ¶
func UniqueSliceBy[T any, K comparable](slice []T, keyFunc func(T) K) []T
UniqueSliceBy 使用自定义键函数去重 keyFunc 用于提取每个元素的唯一标识
Types ¶
type ConditionValue ¶
ConditionValue 是一个泛型结构体,封装一个条件和对应的值 用于链式多条件判断,方便组合使用
type DoFuncWithError ¶
DoFuncWithError 是一个泛型函数类型,表示无参返回 (T, error) 的函数 用于执行可能返回错误的延迟操作
type FindResult ¶
func FindUpdate ¶
func FindUpdate[T any, V any]( item *T, dataMap map[string]V, getKey func(*T, ...any) string, keyArgs ...any, ) *FindResult[T, V]
查找函数,返回 FindResult
func (*FindResult[T, V]) Do ¶
func (r *FindResult[T, V]) Do(f func(*FindResult[T, V])) *FindResult[T, V]
支持无条件执行,方便写一些操作
func (*FindResult[T, V]) IfFound ¶
func (r *FindResult[T, V]) IfFound(f func(*T, *V)) *FindResult[T, V]
如果找到,执行回调,支持修改 item、val
func (*FindResult[T, V]) Item ¶
func (r *FindResult[T, V]) Item() *T
func (*FindResult[T, V]) OrElse ¶
func (r *FindResult[T, V]) OrElse(f func(*T)) *FindResult[T, V]
如果没找到,执行回调
func (*FindResult[T, V]) Then ¶
func (r *FindResult[T, V]) Then(onFound func(*T, *V), onNotFound func(*T)) *FindResult[T, V]
统一处理找到和没找到
func (*FindResult[T, V]) When ¶
func (r *FindResult[T, V]) When(cond bool, f func(*FindResult[T, V])) *FindResult[T, V]
支持条件执行,类似 if
type IFChainBuilder ¶
type IFChainBuilder[T any] struct { // contains filtered or unexported fields }
IFChainBuilder 链式条件构建器,支持无限级别的链式调用 用于处理复杂的条件判断和提前返回逻辑
func (*IFChainBuilder[T]) Execute ¶
func (c *IFChainBuilder[T]) Execute() (T, bool)
Execute 执行链式调用并返回结果
func (*IFChainBuilder[T]) ExecuteOr ¶
func (c *IFChainBuilder[T]) ExecuteOr(defaultValue T) T
ExecuteOr 执行链式调用,如果没有匹配的条件则返回默认值
func (*IFChainBuilder[T]) HasResult ¶
func (c *IFChainBuilder[T]) HasResult() bool
HasResult 检查是否有结果
func (*IFChainBuilder[T]) MustExecute ¶
func (c *IFChainBuilder[T]) MustExecute() T
MustExecute 执行链式调用,如果没有匹配的条件则 panic
func (*IFChainBuilder[T]) When ¶
func (c *IFChainBuilder[T]) When(condition bool) *IFChainBuilderCondition[T]
When 添加条件判断
type IFChainBuilderAction ¶
type IFChainBuilderAction[T any] struct { // contains filtered or unexported fields }
IFChainBuilderAction 操作构建器
func (*IFChainBuilderAction[T]) ContinueChain ¶
func (c *IFChainBuilderAction[T]) ContinueChain() *IFChainBuilder[T]
ContinueChain 继续链式调用
func (*IFChainBuilderAction[T]) Return ¶
func (c *IFChainBuilderAction[T]) Return(value T) *IFChainBuilder[T]
Return 设置返回值
func (*IFChainBuilderAction[T]) ReturnNil ¶
func (c *IFChainBuilderAction[T]) ReturnNil() *IFChainBuilder[T]
ReturnNil 返回零值
type IFChainBuilderCondition ¶
type IFChainBuilderCondition[T any] struct { // contains filtered or unexported fields }
IFChainBuilderCondition 条件构建器
func (*IFChainBuilderCondition[T]) Then ¶
func (c *IFChainBuilderCondition[T]) Then(action func()) *IFChainBuilderAction[T]
Then 条件为真时执行操作
func (*IFChainBuilderCondition[T]) ThenReturn ¶
func (c *IFChainBuilderCondition[T]) ThenReturn(value T, action ...func()) *IFChainBuilder[T]
ThenReturn 条件为真时执行操作并设置返回值
func (*IFChainBuilderCondition[T]) ThenReturnNil ¶
func (c *IFChainBuilderCondition[T]) ThenReturnNil(action ...func()) *IFChainBuilder[T]
ThenReturnNil 条件为真时执行操作并返回 nil(用于返回 error 或指针类型)
type IfChainer ¶
type IfChainer struct {
// contains filtered or unexported fields
}
IfChainer 链式调用构建器,支持优雅的三元运算符链式调用 用于简化 if-else 判断,特别是日志记录等副作用操作
示例:
mathx.When(err != nil).
Then(func() { log.Error("失败") }).
Else(func() { log.Info("成功") }).
Do()
func When ¶
When 创建一个链式调用构建器 参数 condition 为判断条件
Example ¶
err := fmt.Errorf("操作失败")
// 链式调用示例
When(err != nil).
Then(func() { fmt.Println("❌ 发生错误") }).
Else(func() { fmt.Println("✅ 操作成功") }).
Do()
Output: ❌ 发生错误
type IfValueChainer ¶
type IfValueChainer[T any] struct { // contains filtered or unexported fields }
IfValueChainer 链式调用构建器(支持返回值) 用于需要返回值的三元运算
示例:
result := mathx.WhenValue(x > 0).
ThenReturn(100).
ElseReturn(0).
Get()
func WhenValue ¶
func WhenValue[T any](condition bool) *IfValueChainer[T]
WhenValue 创建一个支持返回值的链式调用构建器
Example ¶
x := 5
// 返回值链式调用
result := WhenValue[string](x > 0).
ThenReturn("正数").
ElseReturn("非正数").
Get()
fmt.Println(result)
Output: 正数
func (*IfValueChainer[T]) ElseDo ¶
func (ic *IfValueChainer[T]) ElseDo(fn func() T) *IfValueChainer[T]
ElseDo 设置条件为 false 时执行的函数(返回值)
func (*IfValueChainer[T]) ElseReturn ¶
func (ic *IfValueChainer[T]) ElseReturn(val T) *IfValueChainer[T]
ElseReturn 设置条件为 false 时返回的值
func (*IfValueChainer[T]) ThenDo ¶
func (ic *IfValueChainer[T]) ThenDo(fn func() T) *IfValueChainer[T]
ThenDo 设置条件为 true 时执行的函数(返回值)
func (*IfValueChainer[T]) ThenReturn ¶
func (ic *IfValueChainer[T]) ThenReturn(val T) *IfValueChainer[T]
ThenReturn 设置条件为 true 时返回的值
type LayeredMerger ¶
LayeredMerger 多层级键值对合并器(避免重复传递字段名)
func NewLayeredMerger ¶
func NewLayeredMerger[T any, KV any](keyFieldName, valueFieldName string) *LayeredMerger[T, KV]
NewLayeredMerger 创建多层级合并器
参数:
- keyFieldName: 键值对结构中 key 字段的名称(如 "Key")
- valueFieldName: 键值对结构中 value 字段的名称(如 "Value")
示例:
merger := NewLayeredMerger[Config, LocalizedText]("Key", "Value")
result := merger.Merge(layers, func(c *Config) []LocalizedText { return c.Messages })
func (*LayeredMerger[T, KV]) Merge ¶
func (m *LayeredMerger[T, KV]) Merge(layers []*T, fieldGetter func(*T) []KV) []KV
Merge 执行多层级合并
参数:
- layers: 配置层级切片,从低到高优先级(越靠后优先级越高)
- fieldGetter: 从配置对象中提取键值对切片的函数
返回:合并后的键值对切片
type MapEntry ¶
type MapEntry[K comparable, V any] struct { Key K Value V }
MapEntry 键值对
func MapEntries ¶
func MapEntries[K comparable, V any](in map[K]V) []MapEntry[K, V]
MapEntries 将 map 转为键值对切片
type MapMergeOptions ¶
type MapMergeOptions struct {
Strategy MapMergeStrategy // 合并策略
MaxDepth int // 最大递归深度,0表示不限制
TypeStrict bool // 是否严格类型检查
OnConflict func(key string, target, source interface{}) interface{} // 冲突处理回调
// contains filtered or unexported fields
}
MapMergeOptions Map合并选项
type MapMergeStrategy ¶
type MapMergeStrategy int
MapMergeStrategy Map合并策略
const ( // MapMergeStrategyOverwrite 覆盖策略:源覆盖目标 MapMergeStrategyOverwrite MapMergeStrategy = iota // MapMergeStrategyKeepExisting 保持现有:保留目标值,忽略源 MapMergeStrategyKeepExisting // MapMergeStrategyError 冲突报错:发现冲突时返回错误 MapMergeStrategyError )
type Proba ¶
type Proba struct {
// contains filtered or unexported fields
}
Proba结构体用于根据给定的概率判断事件是否为真。 它内部使用了一个线程不安全的随机数生成器,并通过互斥锁来保证并发安全。
func (*Proba) TrueOnProba ¶
TrueOnProba方法用于根据给定的概率判断事件是否为真。 它接收一个浮点数作为概率参数(范围应在0到1之间),并返回一个布尔值。 如果生成的随机数小于给定的概率,则返回true;否则返回false。 此方法通过加锁来保证在并发访问时的线程安全。
type ResultWithError ¶
ResultWithError 泛型结构体,封装结果和错误
type SliceChain ¶
type SliceChain[T comparable] struct { // contains filtered or unexported fields }
SliceChain 是一个支持链式调用的泛型切片操作结构体,带并发安全锁保护 通过链式调用可以方便地对切片进行追加、去重、排序、过滤等操作
func FromSlice ¶
func FromSlice[T comparable](slice []T) *SliceChain[T]
FromSlice 根据普通切片创建一个新的 SliceChain 实例 Params:
- slice: 需要转换成链式操作结构的普通切片,类型为 []T
Returns:
- 返回一个指向新创建的 SliceChain 实例的指针,内部包含了传入的切片数据副本
func (*SliceChain[T]) Append ¶
func (sc *SliceChain[T]) Append(elements ...T) *SliceChain[T]
Append 追加元素到当前切片,支持链式调用 Params:
- elements: 可变参数,表示需要追加到当前切片中的元素,类型为 T
Returns:
- 返回当前 SliceChain 实例指针,方便链式调用
Examples:
sc.Append(1, 2, 3)
func (*SliceChain[T]) Data ¶
func (sc *SliceChain[T]) Data() []T
Data 返回当前链式操作后的切片数据,方便与普通切片交互 Returns:
- 返回当前内部切片的引用,类型为 []T
注意:返回的是内部切片的引用,修改返回值会影响 SliceChain 内部数据
func (*SliceChain[T]) Filter ¶
func (sc *SliceChain[T]) Filter(f func(T) bool) *SliceChain[T]
Filter 根据传入的过滤函数 f,保留满足条件的元素,支持链式调用 Params:
- f: 过滤函数,接收一个元素 T,返回 bool,返回 true 表示保留该元素,false 表示过滤掉
Returns:
- 返回当前 SliceChain 实例指针,过滤后的数据保存在内部切片中
Examples:
sc.Filter(func(x int) bool { return x%2 == 0 })
func (*SliceChain[T]) RemoveEmpty ¶
func (sc *SliceChain[T]) RemoveEmpty() *SliceChain[T]
RemoveEmpty 移除“空值”元素,空值定义为元素等于类型零值,支持链式调用 适用于数字、字符串、指针等类型的零值判断 Returns:
- 返回当前 SliceChain 实例指针,移除零值元素后的数据保存在内部切片中
func (*SliceChain[T]) RemoveValue ¶
func (sc *SliceChain[T]) RemoveValue(value T) *SliceChain[T]
RemoveValue 移除切片中所有等于指定值的元素,支持链式调用 Params:
- value: 需要从切片中移除的元素值,类型为 T
Returns:
- 返回当前 SliceChain 实例指针,移除指定值后的数据保存在内部切片中
func (*SliceChain[T]) Sort ¶
func (sc *SliceChain[T]) Sort(less func(a, b T) bool) *SliceChain[T]
Sort 使用传入的 less 函数对切片进行排序,支持链式调用 Params:
- less: 比较函数,接收两个元素 a, b,返回 bool,返回 true 表示 a < b
Returns:
- 返回当前 SliceChain 实例指针,排序后的数据保存在内部切片中
Examples:
sc.Sort(func(a, b int) bool { return a < b })
func (*SliceChain[T]) String ¶
func (sc *SliceChain[T]) String() string
String 实现 fmt.Stringer 接口,方便打印 SliceChain 内容 Returns:
- 返回当前切片数据的字符串表示
func (*SliceChain[T]) Uniq ¶
func (sc *SliceChain[T]) Uniq() *SliceChain[T]
Uniq 去重,移除切片中重复的元素,保持元素顺序,支持链式调用 Returns:
- 返回当前 SliceChain 实例指针,去重后的数据保存在内部切片中
type SliceFilter ¶
type SliceFilter[T any] struct { // contains filtered or unexported fields }
SliceFilter 泛型切片过滤器,支持多谓词和策略模式
func NewSliceFilter ¶
func NewSliceFilter[T any](slice []T) *SliceFilter[T]
NewSliceFilter 创建新过滤器实例,默认使用and策略
func (*SliceFilter[T]) Condition ¶
func (f *SliceFilter[T]) Condition(preds ...Predicate[T]) *SliceFilter[T]
Condition 添加一个或多个过滤条件,支持链式调用
func (*SliceFilter[T]) OnMatch ¶
func (f *SliceFilter[T]) OnMatch(cb FilterCallback[T]) *SliceFilter[T]
OnMatch 添加满足筛选条件时的回调函数,支持多次调用添加多个回调。 回调函数接受元素指针,可以修改元素。
func (*SliceFilter[T]) OnNotMatch ¶
func (f *SliceFilter[T]) OnNotMatch(cb FilterCallback[T]) *SliceFilter[T]
OnNotMatch 添加不满足筛选条件时的回调函数,支持多次调用添加多个回调。
func (*SliceFilter[T]) UseAnd ¶
func (f *SliceFilter[T]) UseAnd() *SliceFilter[T]
UseAnd 设置策略为“全部为真”
func (*SliceFilter[T]) UseCustom ¶
func (f *SliceFilter[T]) UseCustom(combine func([]bool) bool) *SliceFilter[T]
UseCustom 设置自定义合并策略
type StatsSummary ¶
type StatsSummary struct {
Count int `json:"count"`
Min float64 `json:"min"`
Max float64 `json:"max"`
Mean float64 `json:"mean"`
StdDev float64 `json:"std_dev"`
P50 float64 `json:"p50"`
P90 float64 `json:"p90"`
P95 float64 `json:"p95"`
P99 float64 `json:"p99"`
}
StatsSummary 统计摘要
type Unstable ¶
type Unstable struct {
// contains filtered or unexported fields
}
Unstable 结构体用于基于给定的偏差值生成围绕均值附近的随机值。
func (Unstable) AroundDuration ¶
AroundDuration 根据给定的基础时长和偏差值返回一个随机的时长。