Documentation
¶
Overview ¶
Package xslice 切片相关常用数据结构和算法
Index ¶
- func ContainsAny[E comparable](all []E, values ...E) bool
- func DeleteValue[S ~[]E, E comparable](s S, values ...E) S
- func DiffMore[S ~[]E, E comparable](old, new S) S
- func Filter[S ~[]E, E any](arr S, filter func(index int, item E, ok int) bool) S
- func FilterAs[E any, Y any](arr []E, filter func(index int, item E, ok int) (Y, bool)) []Y
- func FilterOne[S ~[]E, E any](arr S, filter func(index int, item E) bool) (e E, ok bool)
- func Join[E any](arr []E, sep string) string
- func JoinFunc[E any](arr []E, format func(val E) string, sep string) string
- func MapFunc[S ~[]E, E any](arr S, fn func(index int, item E) (E, bool)) S
- func Merge[S ~[]T, T any](items ...S) S
- func PopHead[S ~[]E, E any](s S) (new S, value E, ok bool)
- func PopHeadN[S ~[]E, E any](s S, n int) (new S, values S)
- func PopTail[S ~[]E, E any](s S) (new S, value E, has bool)
- func PopTailN[S ~[]E, E any](s S, n int) (new S, values S)
- func ToAnys[E any](s []E) []any
- func ToMap[E comparable, V any](s []E, value V) map[E]V
- func ToMapFunc[E any, K comparable, V any](s []E, fn func(index int, v E) (K, V)) map[K]V
- func Unique[S ~[]T, T comparable](arr S) S
- type Ring
- type RingSync
- type RingUnique
- type RingUniqueSync
- type Sync
- func (s *Sync[T]) Append(v ...T)
- func (s *Sync[T]) Clear()
- func (s *Sync[T]) Clone() *Sync[T]
- func (s *Sync[T]) Delete(i int, j int)
- func (s *Sync[T]) DeleteFunc(del func(T) bool)
- func (s *Sync[T]) Grow(n int)
- func (s *Sync[T]) Head() (T, bool)
- func (s *Sync[T]) Insert(index int, v ...T)
- func (s *Sync[T]) Iter() iter.Seq[T]
- func (s *Sync[T]) Load() []T
- func (s *Sync[T]) PopHead() (val T, has bool)
- func (s *Sync[T]) PopHeadN(n int) (values []T)
- func (s *Sync[T]) PopTail() (val T, has bool)
- func (s *Sync[T]) PopTailN(n int) (values []T)
- func (s *Sync[T]) Store(all []T)
- func (s *Sync[T]) Swap(all []T) []T
- func (s *Sync[T]) Tail() (T, bool)
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 ¶
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 Join ¶
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 ¶
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 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 ToAnys ¶
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 ¶
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
type RingSync ¶
type RingSync[T any] struct { // contains filtered or unexported fields }
RingSync 具有指定最大容量的,环形结构的 slice,容量满的情况下,新元素会覆盖老元素,是并发安全的
func NewRingSync ¶
NewRingSync 创建新的 RingSync,caption-容量,应 > 0
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]) 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
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 遍历,先加入的会先遍历
type Sync ¶
type Sync[T any] struct { // contains filtered or unexported fields }
Sync 并发安全的 Slice