aslist
aslist(A Sorted List)是golang语言实现的线程安全可排序的list。便捷的调用方式,使开发者快速入门使用。
前言
近来有喷子喷我,说golang有排序框架何苦要自己造轮子。我只想说中国的拿来主义思想就是导致今天中国为何终始没有自主研发的操作系统,没有自己的芯片。你跟我说这句话就像问"已经有了Java为什么还要学Golang、为什么男人有了老婆还想有小三"。因为需求嘛。各种各样的需求,有人在乎性能,有人在乎便捷,有人在乎二者都在乎。你要是觉得我造的轮子不好,你自己就去造一个更好的。不要在这里说一些显得你很浅薄的话。aslist就是给在乎便捷、不想了解底层算法的人使用。不喜欢你可以走。
为什么要设计aslist?
如果你是从java转golang开发,你就会发现golang中对数组(array)、切片(slice)的封装比较原生。这对开发者来说过去java日常对List方便操作放在golang中是非常痛苦的。如排序(sort)、栈(stack)操作、先进先出(FIFO)、左进右出(LIRI)......本人深耕java多年深刻体会到你的痛苦,所以借鉴java对list体验设计的思路封装了这个轻量级的aslist。使你在golang中能找回java的感觉。
为什么Range、ClearTargets、Pop不能像Java一样使用泛型?
没有办法,当前golang的泛型还没有像Java一样强大。先忍忍,估计马上就要出来了。
快速开始
go get -u github.com/CreditTone/aslist
如果你使用gomod管理依赖
go get -u github.com/CreditTone/aslist@master
导入
import( "github.com/CreditTone/aslist" )
定义结构
type A struct { Name string }
1.创建aslist
asList := NewAsList()
2.push元素
asList.Push(A{Name: "我的名字好长"}) asList.Push(A{Name: "我名长"}) asList.Push(A{Name: "我的名字好长阿"}) asList.Push(A{Name: "我名字长"}) asList.Push(A{Name: "我的名字长"})
3.使用SortWithCompareFunc传入自定义函数排序
asList := NewAsList() asList.Push(A{Name: "我的名字好长"}) asList.Push(A{Name: "我名长"}) asList.Push(A{Name: "我的名字好长阿"}) asList.Push(A{Name: "我名字长"}) asList.Push(A{Name: "我的名字长"}) t.Log("第一次遍历") asList.Range(func(index int, item interface{}) bool { t.Log(index, item) return false //如果要中断遍历,请返回true }) asList.SortWithCompareFunc(func(a, b interface{}) bool { struct_a := a.(A) struct_b := b.(A) if len(struct_a.Name) > len(struct_b.Name) { return true //需要a 排在 b前面返回true } return false }) t.Log("排序后遍历") asList.Range(func(index int, item interface{}) bool { t.Log(index, item) return false //如果要中断遍历,请返回true })
输出结果:
=== RUN TestAsListSortWithCompareFunc
--- PASS: TestAsListSortWithCompareFunc (0.00s)
aslist_test.go:33: 第一次遍历
aslist_test.go:35: 0 {我的名字好长}
aslist_test.go:35: 1 {我名长}
aslist_test.go:35: 2 {我的名字好长阿}
aslist_test.go:35: 3 {我名字长}
aslist_test.go:35: 4 {我的名字长}
aslist_test.go:45: 排序后遍历
aslist_test.go:47: 0 {我的名字好长阿}
aslist_test.go:47: 1 {我的名字好长}
aslist_test.go:47: 2 {我的名字长}
aslist_test.go:47: 3 {我名字长}
aslist_test.go:47: 4 {我名长}
PASS
4.使用指针结构做元素也可以
asList := NewAsList() asList.Push(&A{Name: "我的名字好长"}) asList.Push(&A{Name: "我名长"}) asList.Push(&A{Name: "我的名字好长阿"}) asList.Push(&A{Name: "我名字长"}) asList.Push(&A{Name: "我的名字长"}) t.Log("第一次遍历") asList.Range(func(index int, item interface{}) { t.Log(index, item) }) asList.SortWithComp