xslice

package
v0.0.0-...-b147793 Latest Latest
Warning

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

Go to latest
Published: Jan 7, 2025 License: BSD-3-Clause Imports: 6 Imported by: 0

Documentation

Overview

Package xslice 切片相关常用数据结构和算法

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func ContainsAny

func ContainsAny[E comparable](all []E, values ...E) bool

ContainsAny 判断 all 中是否包含 values 的任意一个值

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	fmt.Println(xslice.ContainsAny([]int{1, 2, 3}, 1))    // true
	fmt.Println(xslice.ContainsAny([]int{1, 2, 3}, 4))    // false
	fmt.Println(xslice.ContainsAny([]int{1, 2, 3}, 3, 4)) // true

}
Output:

true
false
true

func DeleteValue

func DeleteValue[S ~[]E, E comparable](s S, values ...E) S

DeleteValue 删除指定的值

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	fmt.Println(xslice.DeleteValue([]int{1, 2, 3, 4}, 2, 4)) // [1 3]

}
Output:

[1 3]

func DiffMore

func DiffMore[S ~[]E, E comparable](old, new S) S

DiffMore 查找到 new 相比 old 增量的部分,总是返回一个全新的 slice

func Filter

func Filter[S ~[]E, E any](arr S, filter func(index int, item E, ok int) bool) S

Filter 过滤删选出满足条件的元素

filter: 过滤函数,参数依次为 index-元素索引、item 元素、ok-已过滤满足条件的个数

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	result := xslice.Filter(arr, func(index int, item int, ok int) bool {
		return item%2 == 0
	})
	fmt.Println(result)

}
Output:

[2 4 6 8]

func FilterAs

func FilterAs[E any, Y any](arr []E, filter func(index int, item E, ok int) (Y, bool)) []Y

func FilterOne

func FilterOne[S ~[]E, E any](arr S, filter func(index int, item E) bool) (e E, ok bool)

func Join

func Join[E any](arr []E, sep string) string

Join 将 slice 使用默认的 format 方法转换为 string ,然后使用 sep 链接为字符串

若元素有实现 String()string 方法,会优先采用该值,否则会使用 fmt.Sprint

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	fmt.Println(xslice.Join([]int{1, 2}, "-")) // 1-2

}
Output:

1-2

func JoinFunc

func JoinFunc[E any](arr []E, format func(val E) string, sep string) string

JoinFunc 将 slice 使用特定的 format 方法转换为 string ,然后使用 sep 链接为字符串

Example
package main

import (
	"fmt"
	"strconv"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	fmt.Println(xslice.JoinFunc([]int{1, 2}, strconv.Itoa, "-")) // 1-2

	fmt.Println(xslice.JoinFunc([]int{1, 2}, func(val int) string {
		return fmt.Sprintf("%02d", val)
	}, "-")) //  01-02

}
Output:

1-2
01-02

func MapFunc

func MapFunc[S ~[]E, E any](arr S, fn func(index int, item E) (E, bool)) S

func Merge

func Merge[S ~[]T, T any](items ...S) S

Merge merge 多个 slice 为一个,并最终返回一个新的 slice

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	fmt.Println(xslice.Merge([]int{1}, []int{2, 3})) // [1 2 3]

}
Output:

[1 2 3]

func PopHead

func PopHead[S ~[]E, E any](s S) (new S, value E, ok bool)

PopHead 弹出头部的一个元素,若 slice 为空会返回 false

func PopHeadN

func PopHeadN[S ~[]E, E any](s S, n int) (new S, values S)

PopHeadN 弹出头部的 n 个元素

func PopTail

func PopTail[S ~[]E, E any](s S) (new S, value E, has bool)

PopTail 弹出尾部的一个元素,若 slice 为空会返回 false

func PopTailN

func PopTailN[S ~[]E, E any](s S, n int) (new S, values S)

PopTailN 弹出尾部的 n 个元素

func ToAnys

func ToAnys[E any](s []E) []any

ToAnys 转换为 []any 类型

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	fmt.Printf("%#v\n", xslice.ToAnys([]int{1, 2, 3})) // []interface {}{1, 2, 3}

}
Output:

[]interface {}{1, 2, 3}

func ToMap

func ToMap[E comparable, V any](s []E, value V) map[E]V

ToMap 转换为 map,map 的 key 是 slice 的值, map 的 value 是传入的 value 总是返回不为 nil 的 map

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	fmt.Println(xslice.ToMap([]int{1, 2, 3}, true)) // map[1:true 2:true 3:true]
	fmt.Println(xslice.ToMap([]int{1, 2, 3}, "ok")) // map[1:ok 2:ok 3:ok]

}
Output:

map[1:true 2:true 3:true]
map[1:ok 2:ok 3:ok]

func ToMapFunc

func ToMapFunc[E any, K comparable, V any](s []E, fn func(index int, v E) (K, V)) map[K]V

ToMapFunc 使用回调函数,将 slice 转换为 map

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	ss := []int{1, 2, 3}
	result := xslice.ToMapFunc(ss, func(index int, v int) (string, string) {
		key := fmt.Sprintf("key-%d", index)
		value := fmt.Sprintf("value-%d", v)
		return key, value
	})
	fmt.Println(result)

}
Output:

map[key-0:value-1 key-1:value-2 key-2:value-3]

func Unique

func Unique[S ~[]T, T comparable](arr S) S

Unique 返回去重后的 slice

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	fmt.Println(xslice.Unique([]int{1, 2, 1, 3})) // [1 2 3]

}
Output:

[1 2 3]

Types

type Ring

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

Ring 具有指定最大容量的,环形结构的 slice,容量满的情况下,新元素会覆盖老元素,非并发安全的

func NewRing

func NewRing[T any](caption int) *Ring[T]

NewRing 创建新的 Ring,caption-容量,应 > 0

Example
package main

import (
	"fmt"

	"github.com/xanygo/anygo/xslice"
)

func main() {
	r := xslice.NewRing[int](3)

	r.Add(1, 2)
	fmt.Println("Values=", r.Values(), "Len=", r.Len()) // Values= [1 2] Len= 2

	r.Add(3, 4)
	fmt.Println("Values=", r.Values(), "Len=", r.Len()) // Values= [2 3 4] Len= 3

	r.Add(5)
	fmt.Println("Values=", r.Values(), "Len=", r.Len()) // Values= [3 4 5] Len= 3

	fmt.Println("---")
	r.Range(func(v int) bool {
		fmt.Println("range v=", v)
		return v%2 != 0
	})

}
Output:

Values= [1 2] Len= 2
Values= [2 3 4] Len= 3
Values= [3 4 5] Len= 3
---
range v= 3
range v= 4

func (*Ring[T]) Add

func (r *Ring[T]) Add(values ...T)

Add 添加新的元素,容量满的情况下,会覆盖老的值

func (*Ring[T]) AddSwap

func (r *Ring[T]) AddSwap(v T) (old T, swapped bool)

AddSwap 添加并返回被替换的值

func (*Ring[T]) Iter

func (r *Ring[T]) Iter() iter.Seq[T]

func (*Ring[T]) Len

func (r *Ring[T]) Len() int

func (*Ring[T]) Range

func (r *Ring[T]) Range(fn func(v T) bool)

Range 遍历,先加入的会先遍历

func (*Ring[T]) Values

func (r *Ring[T]) Values() []T

Values 返回所有值,先加入的排在前面

type RingSync

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

RingSync 具有指定最大容量的,环形结构的 slice,容量满的情况下,新元素会覆盖老元素,是并发安全的

func NewRingSync

func NewRingSync[T any](caption int) *RingSync[T]

NewRingSync 创建新的 RingSync,caption-容量,应 > 0

func (*RingSync[T]) Add

func (r *RingSync[T]) Add(values ...T)

Add 添加新的元素,容量满的情况下,会覆盖老的值

func (*RingSync[T]) AddSwap

func (r *RingSync[T]) AddSwap(v T) (old T, swapped bool)

AddSwap 添加并返回被替换的值

func (*RingSync[T]) Iter

func (r *RingSync[T]) Iter() iter.Seq[T]

func (*RingSync[T]) Len

func (r *RingSync[T]) Len() int

func (*RingSync[T]) Range

func (r *RingSync[T]) Range(fn func(v T) bool)

Range 遍历,先加入的会先遍历

func (*RingSync[T]) Values

func (r *RingSync[T]) Values() []T

Values 返回所有值,先加入的排在前面

type RingUnique

type RingUnique[T comparable] struct {
	// contains filtered or unexported fields
}

RingUnique 具有唯一值的 ring list,非并发安全的

func NewRingUnique

func NewRingUnique[T comparable](caption int) *RingUnique[T]

func (*RingUnique[T]) Add

func (r *RingUnique[T]) Add(values ...T)

Add 添加新的元素,容量满的情况下,会覆盖老的值

func (*RingUnique[T]) AddSwap

func (r *RingUnique[T]) AddSwap(v T) (old T, swapped bool)

AddSwap 添加并返回被替换的值

func (*RingUnique[T]) Iter

func (r *RingUnique[T]) Iter() iter.Seq[T]

func (*RingUnique[T]) Len

func (r *RingUnique[T]) Len() int

func (*RingUnique[T]) Range

func (r *RingUnique[T]) Range(fn func(v T) bool)

Range 遍历,先加入的会先遍历

func (*RingUnique[T]) Values

func (r *RingUnique[T]) Values() []T

Values 返回所有值,先加入的排在前面

type RingUniqueSync

type RingUniqueSync[T comparable] struct {
	// contains filtered or unexported fields
}

RingUniqueSync 具有唯一值的 ring list,是并发安全的

func NewRingUniqueSync

func NewRingUniqueSync[T comparable](caption int) *RingUniqueSync[T]

func (*RingUniqueSync[T]) Add

func (r *RingUniqueSync[T]) Add(values ...T)

Add 添加新的元素,容量满的情况下,会覆盖老的值

func (*RingUniqueSync[T]) AddSwap

func (r *RingUniqueSync[T]) AddSwap(v T) (old T, swapped bool)

AddSwap 添加并返回被替换的值

func (*RingUniqueSync[T]) Iter

func (r *RingUniqueSync[T]) Iter() iter.Seq[T]

func (*RingUniqueSync[T]) Len

func (r *RingUniqueSync[T]) Len() int

func (*RingUniqueSync[T]) Range

func (r *RingUniqueSync[T]) Range(fn func(v T) bool)

Range 遍历,先加入的会先遍历

func (*RingUniqueSync[T]) Values

func (r *RingUniqueSync[T]) Values() []T

Values 返回所有值,先加入的排在前面

type Sync

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

Sync 并发安全的 Slice

func (*Sync[T]) Append

func (s *Sync[T]) Append(v ...T)

Append 在尾部插入元素

func (*Sync[T]) Clear

func (s *Sync[T]) Clear()

Clear 清除所有值

func (*Sync[T]) Clone

func (s *Sync[T]) Clone() *Sync[T]

func (*Sync[T]) Delete

func (s *Sync[T]) Delete(i int, j int)

Delete 删除 s[i:j] 之间的元素

func (*Sync[T]) DeleteFunc

func (s *Sync[T]) DeleteFunc(del func(T) bool)

DeleteFunc 删除满足回调函数的元素

func (*Sync[T]) Grow

func (s *Sync[T]) Grow(n int)

Grow 分配容量

func (*Sync[T]) Head

func (s *Sync[T]) Head() (T, bool)

Head 读取头部的元素,若 slice 为空会返回 false

func (*Sync[T]) Insert

func (s *Sync[T]) Insert(index int, v ...T)

Insert 在指定的位置插入元素

func (*Sync[T]) Iter

func (s *Sync[T]) Iter() iter.Seq[T]

func (*Sync[T]) Load

func (s *Sync[T]) Load() []T

Load 返回所有的值

func (*Sync[T]) PopHead

func (s *Sync[T]) PopHead() (val T, has bool)

PopHead 弹出头部的一个元素,若 slice 为空会返回 false

func (*Sync[T]) PopHeadN

func (s *Sync[T]) PopHeadN(n int) (values []T)

PopHeadN 弹出头部的 n 个元素,若 slice 为空会返回 false

func (*Sync[T]) PopTail

func (s *Sync[T]) PopTail() (val T, has bool)

PopTail 弹出尾部的一个元素,若 slice 为空会返回 false

func (*Sync[T]) PopTailN

func (s *Sync[T]) PopTailN(n int) (values []T)

PopTailN 弹出尾部的 n 个元素,若 slice 为空会返回 false

func (*Sync[T]) Store

func (s *Sync[T]) Store(all []T)

Store 用传入的 slice 替换原有所有的值

func (*Sync[T]) Swap

func (s *Sync[T]) Swap(all []T) []T

Swap 用传入的 slice 替换原有所有的值,并返回原有的值

func (*Sync[T]) Tail

func (s *Sync[T]) Tail() (T, bool)

Tail 读取尾部的元素,若 slice 为空会返回 false

Jump to

Keyboard shortcuts

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