Go 每日一库:提升开发效率的 collection
collection 手册地址:最近把collection库升级到v1.3.1版本 。
从v1.2.0 到v1.3.1 开发做了如下改动:
- 说明文档改造成线上手册
- 增加了 ObjPointCollection 结构
- 增加了 toObjs 方法
- 重构了 AbsArray
- 增加了 ContainsCount 方法
- errors 库换成 github.com/pkg/errors 库
我的思考是这样把方法的说明拆分开 , 后续手册中可以扩展一些使用示例等 。 使用 vuepress 的好处还是不少的 , 一个是在自己的阿里云服务器上搭建了一个手册地址:。 这个地址让我在开发过程中更方便查看了 , 不用再上 github 上面看了 。 毕竟 github 最近也不是那么好登陆了 。
文章插图
20201022131102
这里可以安利下 vuepress , 很好用的一个 markdown 转 html 的工具 。
增加了 ObjPointCollection 结构这个需求源自我业务开发中遇到的需求 。 指针对象数组 。 我们希望指针对象数组也能使用 Colleciton 库的所有方法 。 所以增加了这个方法 。
type FooBar struct { Foo string Bar int}func FooBarCompare(a interface{}, b interface{}) int { aobj := a.(*FooBar) bobj := b.(*FooBar) return aobj.Bar - bobj.Bar}func InitFooObjPoints() []*FooBar { return []*FooBar{{Foo: "astring",Bar: 1,},{Foo: "bstring",Bar: 2,}, }}func TestObjPointCollection_Normal(t *testing.T) { objs := InitFooObjPoints() coll := NewObjPointCollection(objs).SetCompare(FooBarCompare) //[Append](#Append) 挂载一个元素到当前Collection {count := coll.Copy().Append(&FooBar{Foo: "cstring",Bar: 3,}).Count()if count != 3 {t.Fatal("append error")} } // [Contain](#Contain) 判断一个元素是否在Collection中 {obj := objs[0]if coll.Contains(obj) != true {t.Fatal("contains error")} } // [Copy](#Copy) 根据当前的数组 , 创造出一个同类型的数组 {if coll.Copy().Count() != 2 {t.Fatal("copy error")}}}
增加了 toObjs 方法这个方法是针对 ObjCollection 和 ObjPointCollection 设计的 。 如果我们想要将 Collection 还原成对象数组 , 或者对象指针数组的时候 , 可以使用这个方法 。 这个方法使用了反射 。func TestObjPointCollection_ToObjs(t *testing.T) { a1 := &Foo{A: "a1", B: 1} a2 := &Foo{A: "a2", B: 2} a3 := &Foo{A: "a3", B: 3} bArr := []*Foo{} objColl := NewObjPointCollection([]*Foo{a1, a2, a3}) err := objColl.ToObjs(&bArr) if err != nil {t.Fatal(err) } if len(bArr) != 3 {t.Fatal("toObjs error len") } if bArr[1].A != "a2" {t.Fatal("toObjs error copy") }}
重构了 AbsArray之前的这篇 guide/introduce.html 说了我当时设计 collection 库的思考 。 但是在1.3.1 版本的时候 , 觉得实现的思维还是不够清晰 。 这次我的改造包括在底层 AbsArray 中存储了上层 collection 的类型 。const ( TYPE_UNKNWON EleType = iota Type_INT Type_INT64 Type_INT32 TYPE_STRING TYPE_FLOAT32 TYPE_FLOAT64 TYPE_OBJ TYPE_OBJ_POINT)
然后在内部实现了 must 相关的防御方法:mustSetComparemustBeNumTypemustBeBaseTypemustNotBeBaseTypemustNotBeEmpty
最后在每个具体实现的方法前先进行防御判断 。 这样整体代码可读性会得到提升 。增加 ContainsCount 方法这个方法也是使用过程中提到的 , 我们希望不仅仅判断一个元素是否在数组中 , 也想判断这个元素在数组中出现了几次 。 于是便有了这个方法 。
func TestAbsCollection_ContainsCount(t *testing.T) { intColl := NewIntCollection([]int{1, 2, 2, 3}) count := intColl.ContainsCount(2) if count != 2 {t.Fatal(errors.New("contains count error")) }}
errors 换成 github.com/pkg/errors官方 errors 库换成 pkg/errors 库的好处这里就不赘述了 , 有兴趣的可以参考总结最近内部又有一个新的模块服务使用 collection 库进行业务开发 , 真实感受加快了不少开发速度 。
祝用的高兴 。
【Go 每日一库:提升开发效率的 collection】项目地址: 欢迎star 。
文章插图
- “树标提质”提升“软实力”数字经济时代创新载体大有可为
- 每日|【每日idea 分享】12月1日:带朋友一起网上购物;线上笔记本应用程序
- 创园|中国V谷的云存储之道,马栏山文创园将视频处理效率提升6倍
- 消费|宿言:早看早应用~提升零售产品销售额的9个手段!
- 出行|嘀嗒出行“出租车·新出行”提升运营效率降低空驶率增加司机收入
- 产能|LG化学将中国工厂产能提升一倍 以满足特斯拉需求
- A14|苹果全面提升,A14+4500毫安+隐藏镜头,4800万四摄+手写笔
- 有道词典笔3上市:这支笔能看动画,扫查变点查体验提升
- EVGA RTX3080更新BIOS 显卡功耗提升至450W
- 2019年度江西省科技经费投入进一步提升