goutil

package module
v0.0.0-...-975354a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 9, 2024 License: MIT Imports: 4 Imported by: 1

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() 返回队首的元素,不取出

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type BlockingQueue

type BlockingQueue[T any] struct {
	// contains filtered or unexported fields
}

BlockingQueue 线程安全的队列,容量无限,用链表实现

func NewBlockingQueue

func NewBlockingQueue[T any]() *BlockingQueue[T]

NewBlockingQueue 新建一个线程安全的队列

func (*BlockingQueue[T]) Len

func (q *BlockingQueue[T]) Len() int64

func (*BlockingQueue[T]) Peek

func (q *BlockingQueue[T]) Peek() (e T, ok bool)

Peek 返回队首的元素,不取出

func (*BlockingQueue[T]) Poll

func (q *BlockingQueue[T]) Poll() (e T, ok bool)

Poll 从队首获取一个元素,不阻塞

func (*BlockingQueue[T]) Put

func (q *BlockingQueue[T]) Put(e T)

Put 向队尾插入一个元素。因为容量无限,所以不会阻塞

func (*BlockingQueue[T]) Take

func (q *BlockingQueue[T]) Take() T

Take 从队首获取一个元素,如果队列为空则阻塞

type PriorityQueue

type PriorityQueue[T any] interface {
	Add(e T)

	Peek() T

	Remove(o T) bool

	Contains(o T) bool

	// ToSlice 返回队列中的所有元素。
	//
	// 注意,ToSlice并不一定按照大小顺序返回
	ToSlice(in []T) []T

	// Foreach 循环对队列中的每个元素调用函数f。对于f的返回值,若返回true表示继续循环,返回false表示跳出循环。
	//
	// 注意,Foreach并不一定按照大小顺序执行
	Foreach(f func(e T) bool)

	Len() int

	Clear()

	Poll() T
}

PriorityQueue 优先队列

func NewDefaultPriorityQueue

func NewDefaultPriorityQueue[T cmp.Ordered](values []T) PriorityQueue[T]

NewDefaultPriorityQueue 用给定的初始值新建优先队列

func NewPriorityQueue

func NewPriorityQueue[T any](values []T, comparator func(o1, o2 T) int) PriorityQueue[T]

NewPriorityQueue 用给定的初始值和比较函数新建优先队列

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL