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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 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 := []int{1, 3, 4}
sliceutil.Insert(&sl, 1, 2)
// sl = [1 2 3 4]

Remove

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

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

Push

向切片尾部插入元素

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

Pop

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

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

Unshift

向切片首部插入元素

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

Shift

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

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

反转类函数

Reverse

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

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

ReverseSelf

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

func ReverseSelf[T any](slice []T)
sl := []int{1, 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"}

源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W先生-SirW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值