为什么 go语言的slice内部函数那么少?

1、作为一个新手,我认知的go的slice函数只有append以及切片,比如查找等方法并没有,为什么不去设计更多的内部函数呢?
2、有没有实现了实现slice更多方法的package?

阅读 3.3k
3 个回答

因为目前golang不支持泛型,所以很难实现你说的多种查找方法,尤其是像C#一样的lamada表达式方式查找或linq方式查找。
像实现查找可以针对自己需要的slice类型进行type 定义,然后自己实现查找。

基本的查询方法是有的,sort 包下面有基于二分查找的方法。但也只是支持一些基础的类型,一般情况下也够用了。如果要实现其他自定义类型查找,还是需要自己实现。

题主补充的第二个问题,关于 slice 的包。标准库里面有一些,如 sort。但我不想说这些,关于数据结构的操作,无非是增删改查,想想 slice 如何实现它们,是否需要别人帮忙实现。

创建,是首先会想到的,golang 中 slice 的创建通过 make 实现,支持传入 len 和 cap 参数。

unshift 和 append,先说append,即向后追加,内置函数 append 的容易做到,我们都知道,slice 底层是数组,append 函数支持自动扩容。unshift,前向追加其实也可以这么做,只需要把 append 中参数调换个位置。

shift 和 pop,分别指从头部和尾部弹出,完全可以通过 reslice 实现,即通过切片完成,比如有 slice 名为 b,shift 操作只需要 b[1:],pop 通过 b[:len(b)-1] 完成。

insert,任意位置插入如何实现,结合两次 append 即可,比如切片 b 在 i 位置插入元素 x,执行 b = append(b[:i], append([]T{x}, a[i:]...)...) 即可,看起来似乎有点复杂。

index,直接遍历就好了,不是很复杂,我觉得 Go 不实现它,是因为太简单,可以通过第三包支持。

其他还有的操作,比如 shuffle、reverse、filter,都可以通过循环实现。

如果有这样的基础包,我觉得,大概也就是这么个意思。最多是在算法上做些优化,比如查找功能,除了循环实现,前面说的 sort 中的 search 也可以实现。如果对查询性能要求比较高,还可以结合 map 的 key 实现快速查找。可以看看我的文章 Go 中如何使用 set

看到前面有答主提到个开源包,我觉得我是不会用的,因为多数功能自己实现还是比较简单的,完全没必要引入新包。

1 篇内容引用
推荐问题
宣传栏