collection v1.3.1升级全记录
collection v1.3.1升级全记录
项目地址: https://github.com/jianfengye/collection 欢迎star。
collection 手册地址: http://collection.funaio.cn/
collection库升级到v1.3.1版本。
从v1.2.0 到v1.3.1 开发做了如下改动:
- 说明文档改造成线上手册
- 增加了 ObjPointCollection 结构
- 增加了 toObjs 方法
- 重构了 AbsArray
- 增加了 ContainsCount 方法
- errors 库换成 github.com/pkg/errors 库
说明文档改造成线上手册
这个是组内前端同学的启发,他们写文档手册喜欢用vuepress。于是我将之前的库说明手册,一个大文件 README.md,修改成为了 docs 目录下的“指南” 和 “手册” 两个部分。手册中每个方法都是一个 markdown。
我的思考是这样把方法的说明拆分开,后续手册中可以扩展一些使用示例等。使用 vuepress 的好处还是不少的,一个是在自己的阿里云服务器上搭建了一个手册地址:http://collection.funaio.cn/ 。 这个地址让我在开发过程中更方便查看了,不用再上 github 上面看了。毕竟 github 最近也不是那么好登陆了。

这里可以安利下 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
之前的这篇 http://collection.funaio.cn/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 相关的防御方法:
mustSetCompare
mustBeNumType
mustBeBaseType
mustNotBeBaseType
mustNotBeEmpty
最后在每个具体实现的方法前先进行防御判断。这样整体代码可读性会得到提升。
增加 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 库的好处这里就不赘述了,有兴趣的可以参考 https://www.bilibili.com/video/BV1hE411c7Ze/
总结
最近内部又有一个新的模块服务使用 collection 库进行业务开发,真实感受加快了不少开发速度。
祝用的高兴。
collection v1.3.1升级全记录的更多相关文章
- Redhat Linux内核升级全记录(转)
http://www.sina.com.cn 2001/06/15 15:38 中国电脑教育报 李红 Redhat Linux因为比较容易上手,所以用户很多.它系统配置完善,预装了丰富的应 ...
- 线上服务器PHP版本编译安装升级全记录
1.将原来的PHP重命名一下 cd /usr/local/bin/ mv php php.2.9 2.安装依赖 yum install gcc gcc-c++ libxml2 libxml2-deve ...
- 在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录
在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录 时间:2017年9月20日 一.软件环境: IP:192.168.1.71 Hostname:centos73-2.sur ...
- Express+Mongoose(MongoDB)+Vue2全栈微信商城项目全记录(二)
用mogoose搭建restful测试接口 接着上一篇(Express+Mongoose(MongoDB)+Vue2全栈微信商城项目全记录(一))记录,今天单独搭建一个restful测试接口,和项目前 ...
- lubuntu踩坑全记录
为了降低系统占用,毕业之后一直用lubuntu不用ubuntu...操作其实差不多,就是lubuntu有一些小坑坑:P 本文是我的踩坑全记录.长期更新. 调分辨率 升级命令lubuntu不出登录页面 ...
- Kubernetes 升级过程记录:从 1.17.0 升级至最新版 1.20.2
本文记录的是将 kubernetes 集群从 1.17.0 升级至最新版 1.20.2 的实际操作步骤,由于 1.17.0 无法直接升级到 1.20.2,需要进行2次过滤升级,1.17.0 -> ...
- MonkeyImage API 实践全记录
1. 背景 鉴于网上使用MonkeyImage的实例除了方法sameAs外很难找到,所以本人把实践各个API的过程记录下来然自己有更感性的认识,也为往后的工作打下更好的基础.同时也和上一篇文章& ...
- 在CentOS6上配置MHA过程全记录
在CentOS6上配置MHA过程全记录 MHA(Master High Availability)是一款开源的MariaDB or MySQL高可用程序,为MariaDB or MySQL主从复制架构 ...
- DS4700磁盘阵列的控制器微码升级操作记录(收录百度文库)
DS4700磁盘阵列的控制器微码升级操作记录 项目介绍: 于10年3月,XX地市区/州XX分公司相继反映生产读取数据速度较之前变得非常慢,表现在:日常报表抽取数据速度明显变慢,客户打开前台页面速度 ...
随机推荐
- C语言知识点汇集
int main() {// int num; int value; = int num,value; '''同时定义多个变量的方法 但是切记只能是同种类型的''' 都是int 或double等其他类 ...
- golang "%p"学习记录随笔
对于获取slice的指针地址, 通过unsafe.Pointer 和 "%p"占位符两种方式得到的地址是不同的 s := make([]int, 1) t.Log(unsafe.P ...
- Flutter学习五之网络请求和轮播图的实现
上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢?官方使用的是dart io中的HttpClient发起的请求,但HttpCl ...
- Sqlmap爆库命令的简单使用
转载:https://blog.csdn.net/qq_41617034/article/details/89502428 测试地址:因为涉及商业隐私,这里就不列啦 我这里用的是windows,并没有 ...
- jdk在linux下安装、配置环境变量
1.jdk下载: 下载地址:https://www.oracle.com/java/technologies/javase-downloads.html 2. 3. 4.解压jdk到/usr/loca ...
- java进阶(19)--异常处理机制
一.基本概念 1.异常的作用: java将异常信息打印至控制台,供程序修改,增加其健壮性. int c=1/0; //将抛出 java.lang.ArithmeticException 2.异常 ...
- 微信小程序-实现文字跑马灯-wepy
百度蛮多例子的,但是代码太长懒得看了 前言 要实现跑马灯主要就是获得判断开始定界和结束定界, 1.9.3新增的wxml操作接口 就可以拿到节点长宽等属性,当然你也可以直接用 文字数量 * 文字大小(注 ...
- NIO 实现简单群聊功能
服务端: package com.yang.runnable; import java.io.IOException; import java.net.InetSocketAddress; impor ...
- Android 字符串的常用操作
目录 Substring 基本语法 IndexOf 基本语法 Split 基本语法 Substring 基本语法 str.substring(","); //从第一个,号开始截取 ...
- WordPress用户角色权限
[转自:群燕小站(http://www.zqunyan.com):原文链接: http://www.zqunyan.com/158.html] WordPress默认的用户角色有5个:订阅者,投稿者, ...