Go 切片的类 js es6 数组操作封装

Posted W先生-SirW

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 切片的类 js es6 数组操作封装相关的知识,希望对你有一定的参考价值。

这里写目录标题

前言

最近由于工作上的原因学习了 Go 语言,由于写前端写习惯了,所以感觉 Go 中切片的相关操作有点别扭,于是趁着 1.18 发布了泛型之后,照着 js 中的数组操作写了一套 Go 的切片工具库,特此分享一下~~

导入

运行命令下载代码包

go get github.com/wyb199877/sliceutil

在项目中导入

import "github.com/wyb199877/sliceutil"

操作类函数

Foreach

遍历切片中的元素

func Foreach[T any](
  slice []T, 
  action func(item T, index int, slice []T)
)
sl := []int1, 2, 3
sliceutil.Foreach(sl, func(it int, idx int, s []int) 
  // ... do something
)

Map

切片内元素转换

func Map[T, R any](
  slice []T,
  action func(item T, index int, slice []T) R,
) []R
sl := []int1, 2, 3
strs := sliceutil.Map(sl, func(it int, idx int, s []int) string 
  return strconv.Itoa(it)
)
// strs = ["1" "2" "3"]

Filter

切片元素过滤器

func Filter[T any](
  slice []T,
  action func(value T, index int, slice []T) bool,
) []T 
sl := []int1, 2, 3
odds := sliceutil.Filter(sl, func(it int, idx int, s []int) bool 
  return it%2 != 0
)
// odds = [1 3]

Reduce

切片元素累加器(未实现初始值)

func Reduce[T any](
  slice []T,
  action func(result T, item T, index int, slice []T) T,
) T
sl := []int1, 2, 3
sum := sliceutil.Reduce(sl, func(ret int, it int, idx int, s []int) int 
  return ret + it
)
// sum = 6

查找类函数

Find

查找切片内第一个满足条件的元素

func Find[T any](
  slice []T,
  action func(item T, index int, slice []T) bool,
) (t T, hasFound bool)
sl := []int1, 2, 3
target, hasFound := sliceutil.Find(sl, func(it int, idx int, s []int) bool 
  return it%2 != 0
)
// target = 1, hasFound = true

target, hasFound = sliceutil.Find(sl, func(it int, idx int, s []int) bool 
  return it > 3
)
// target = 0, hasFound = false

FindIndex

查找切片内第一个满足条件元素的索引值

func FindIndex[T any](
  slice []T,
  action func(item T, index int, slice []T) bool,
) int
sl := []int1, 2, 3
index := sliceutil.FindIndex(sl, func(it int, idx int, s []int) bool 
  return it%2 != 0
)
// index = 0

index = sliceutil.FindIndex(sl, func(it int, idx int, s []int) bool 
  return it > 3
)
// index = -1

IndexOf

查找切片内第一个等于目标值元素的索引值

func IndexOf[T comparable](slice []T, target T) int
sl := []int1, 2, 3
index := sliceutil.IndexOf(sl, 1)
// index = 0

index = sliceutil.IndexOf(sl, 4)
// index = -1

LastIndexOf

查找切片内最后一个等于目标值元素的索引值

func LastIndexOf[T comparable](slice []T, target T) int
sl := []int1, 2, 3, 1
index := sliceutil.LastIndexOf(sl, 1)
// index = 3

index = sliceutil.LastIndexOf(sl, 4)
// index = -1

Includes

判断切片内是否存在与目标值相等的元素

func Includes[T comparable](slice []T, target T) bool
sl := []int1, 2, 3
isExist := sliceutil.Includes(sl, 1)
// isExist = true

isExist = sliceutil.Includes(sl, 4)
// isExist = false

Some

判断切片内是否存在满足条件的元素

func Some[T any](
  slice []T,
  action func(item T, index int, slice []T) bool,
) bool
sl := []int1, 3, 5
isExist := sliceutil.Some(sl, func(it int, idx int, s []int) bool 
  return it%2 != 0
)
// isExist = true

isExist = sliceutil.Some(sl, func(it int, idx int, s []int) bool 
  return it%2 == 0
)
// isExist = false

Every

判断切片内的元素是否均满足条件

func Every[T any](
  slice []T,
  action func(item T, index int, slice []T) bool,
) bool
sl := []int1, 3, 5
isEvery := sliceutil.Every(sl, func(it int, idx int, s []int) bool 
  return it%2 != 0
)
// isEvery = true

isEvery = sliceutil.Every(sl, func(it int, idx int, s []int) bool 
  return it%2 == 0
)
// isEvery = false

修改类函数

这一类的函数均直接操作切片地址指向的内存空间

Insert

向切片内指定索引处插入元素

func Insert[T any](sp *[]T, index int, items ...T)
sl := []int1, 3, 4
sliceutil.Insert(&sl, 1, 2)
// sl = [1 2 3 4]

Remove

从切片中移除指定索引的元素(请确保该位置有元素存在)

func Remove[T any](sp *[]T, index int)
sl := []int1, 3, 4
sliceutil.Remove(&sl, 1)
// sl = [1 4]

Push

向切片尾部插入元素

func Push[T any](sp *[]T, items ...T)
sl := []int1, 2, 3
sliceutil.Push(&sl, 4)
// sl = [1 2 3 4]

Pop

弹出并返回切片的最后一个元素(请勿对空切片操作)

func Pop[T any](sp *[]T) T
sl := []int1, 2, 3
last := sliceutil.Pop(&sl)
// last = 3, sl = [1 2]

Unshift

向切片首部插入元素

func Unshift[T any](sp *[]T, items ...T)
sl := []int2, 3, 4
sliceutil.Unshift(&sl, 1)
// sl = [1 2 3 4]

Shift

弹出并返回切片的第一个元素(请勿对空切片操作)

func Shift[T any](sp *[]T) T
sl := []int1, 2, 3
first := sliceutil.Shift(&sl)
// first = 1, sl = [2 3]

反转类函数

Reverse

反转切片内的元素顺序,仅拷贝,不操作内存空间

func Reverse[T any](slice []T) []T
sl := []int1, 2, 3
sl = sliceutil.Reverse(sl)
// sl = [3 2 1]

ReverseSelf

反转切片内的元素顺序,直接操作内存空间

func ReverseSelf[T any](slice []T)
sl := []int1, 2, 3
sliceutil.ReverseSelf(sl)
// sl = [3 2 1]

转换类函数

ToMap

将切片转换为 map

func ToMap[T any, K comparable, V any](
  slice []T,
  key func(item T) K,
  value func(item T) V,
) map[K]V 
sl := []string"a", "b", "c"
mp := sliceutil.ToMap(sl, func(it string) string 
  return strings.ToUpper(it)
, func(it string) string 
  return it
)
// mp = map[string]string"A":"a", "B":"b", "C":"c"

源码

以上是关于Go 切片的类 js es6 数组操作封装的主要内容,如果未能解决你的问题,请参考以下文章

Go 切片的类 js es6 数组操作封装

go语言入门四(复合类型 数组切片 指针)

go语言入门四(复合类型 数组切片 指针)

Go 切片

go语言的数组与切片

Go切片实现