Categorygithub.com/CuteReimu/goutil
repositorypackage
0.0.0-20240422034935-940ce604f878
Repository: https://github.com/cutereimu/goutil.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author

# README

goutil

参考其它语言联想出来的一些实用工具类

math

函数说明
math.MinInt32(1,2,3)获取多个数中的最小值
math.MaxFloat32(1.2,2.3)获取多个数中的最大值

slices

函数说明
slices.Contains(arr, e)判断一个 slice 中是否包含某个元素
slices.Equals(arr1, arr2)当且仅当两个 slice 长度相同且包含的元素完全相同时返回 ture ,否则返回 false
slices.CopyOf(arr, 5)复制指定的 slice ,根据 newLength ,如果有必要,则截取或者在后面填默认的零值
slices.CopyOfRange(arr, 5, 10)将指定 slice 从 from 到 to 下标复制出来,如果 to 比原 slice 的长度更长,则在后面补默认的零值
slices.ShuffleN(rand, arr, n)打乱一个 slice ,但后续只会用前n个值,因此做了一些优化
slices.Any(arr, f)只要 slice 中的任一元素满足给定的 func ,就返回 true ,否则返回 false
slices.All(arr, f)仅当 slice 中的所有元素都满足给定的 func , 才返回 true ,否则返回 false
slices.Sort(arr, lessFunc)排序,改变原 slice
slices.Usort(arr, lessFunc)排序并去重,返回新的 slice
slices.Uniq(arr)去重,返回新的 slice

支持了部分Go1.22的range-over-function试验性特性,请配合GOEXPERIMENT=rangefunc使用

import "github.com/CuteReimu/goutil/slices"

func main() {
    for i := range slices.Range(1, 5) {
        fmt.Println(i)
    }
}

strings

函数说明
strings.IsEmpty(s)判断字符串是否为空
strings.IsBlank(s)判断字符串是否全为空白

PriorityQueue

函数说明
goutil.NewDefaultPriorityQueue[int](values)用给定的初始值新建优先队列
goutil.NewPriorityQueue[int](values, cmp)用给定的初始值和比较函数新建优先队列
q.Add(value)向优先队列里添加一个元素
q.Peek()获取(但不移除)优先队列的第一个元素
q.Remove(value)从队列中移除指定的元素
q.Contains(value)判断优先队列里是否包含指定的元素
q.ToSlice(nil)返回队列中的所有元素(不一定按大小顺序)
q.Foreach(f)遍历队列中的所有元素(不一定按大小顺序)
q.Len()返回优先队列中元素的个数
q.Clear()清空优先队列
q.Poll()移除并返回优先队列的第一个元素

BlockingQueue

线程安全的队列,采用链表的方式实现,支持无限容量(不能超过INT_MAX)。

blocking_queue_test.go 中有与数组方式实现的性能对比。因为数组方式需要频繁拷贝数组(循环数组的实现方式没法做到无限容量),因此链表方式性能略好约三成左右。

函数说明
goutil.NewBlockingQueue[int]()创建一个线程安全的队列
q.Len()返回队列中的元素个数
q.Put(e)向队尾插入一个元素,不会阻塞
q.Take()从队首获取一个元素,如果队列为空则阻塞
q.Poll()从队首获取一个元素,不阻塞
q.Peek()返回队首的元素,不取出