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升级全记录的更多相关文章

  1. Redhat Linux内核升级全记录(转)

        http://www.sina.com.cn 2001/06/15 15:38 中国电脑教育报 李红   Redhat Linux因为比较容易上手,所以用户很多.它系统配置完善,预装了丰富的应 ...

  2. 线上服务器PHP版本编译安装升级全记录

    1.将原来的PHP重命名一下 cd /usr/local/bin/ mv php php.2.9 2.安装依赖 yum install gcc gcc-c++ libxml2 libxml2-deve ...

  3. 在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录

    在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录 时间:2017年9月20日 一.软件环境: IP:192.168.1.71 Hostname:centos73-2.sur ...

  4. Express+Mongoose(MongoDB)+Vue2全栈微信商城项目全记录(二)

    用mogoose搭建restful测试接口 接着上一篇(Express+Mongoose(MongoDB)+Vue2全栈微信商城项目全记录(一))记录,今天单独搭建一个restful测试接口,和项目前 ...

  5. lubuntu踩坑全记录

    为了降低系统占用,毕业之后一直用lubuntu不用ubuntu...操作其实差不多,就是lubuntu有一些小坑坑:P 本文是我的踩坑全记录.长期更新. 调分辨率  升级命令lubuntu不出登录页面 ...

  6. Kubernetes 升级过程记录:从 1.17.0 升级至最新版 1.20.2

    本文记录的是将 kubernetes 集群从 1.17.0 升级至最新版 1.20.2 的实际操作步骤,由于 1.17.0 无法直接升级到 1.20.2,需要进行2次过滤升级,1.17.0 -> ...

  7. MonkeyImage API 实践全记录

    1.    背景 鉴于网上使用MonkeyImage的实例除了方法sameAs外很难找到,所以本人把实践各个API的过程记录下来然自己有更感性的认识,也为往后的工作打下更好的基础.同时也和上一篇文章& ...

  8. 在CentOS6上配置MHA过程全记录

    在CentOS6上配置MHA过程全记录 MHA(Master High Availability)是一款开源的MariaDB or MySQL高可用程序,为MariaDB or MySQL主从复制架构 ...

  9. DS4700磁盘阵列的控制器微码升级操作记录(收录百度文库)

    DS4700磁盘阵列的控制器微码升级操作记录   项目介绍: 于10年3月,XX地市区/州XX分公司相继反映生产读取数据速度较之前变得非常慢,表现在:日常报表抽取数据速度明显变慢,客户打开前台页面速度 ...

随机推荐

  1. js动画之轮播图

    一. 使用Css3动画实现 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  2. CSAPP 第一章 计算机系统漫游

    第一章 计算机系统漫游 C语言的起源:(系统级编程的首选) C语言与Unix操作系统关系密切 C语言小而简单:其设计由一个人掌控 C语言是为实践目的设计的:其设计用来实现Unix操作系统 C语言程序编 ...

  3. ant在windows环境下安装

    前言: Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发. 举个例子说明:平时在写 Java 程序的时候,基本的步骤都是 打 ...

  4. 1.Concurrent概述

  5. 结合源码谈谈ThreadLocal!

    目录 ThreadLocal的作用 ThreadLocal 1.对象初始化 2.获取变量 3.设置变量 4.移除变量 ThreadLocalMap 1.Entry 2.初始化 3.获取Entry 4. ...

  6. Pandas 中的遍历与并行处理

    使用 pandas 处理数据时,遍历和并行处理是比较常见的操作了本文总结了几种不同样式的操作和并行处理方法. 1. 准备示例数据 import pandas as pd import numpy as ...

  7. splunk公司的一道笔试题

    题目要求: 一个游泳馆里有很多储物柜,每个储物柜都有一个ID号,但是老板不喜欢4这个数字,所以ID号里都不能有4,ID号从1开始编号,让你设计所有储物柜的ID号,用程序输出,比如输入  4输出  5输 ...

  8. java实现详细的身份证验证、能正确验证身份证正确性

    IdCardExpUtil.java package com.javazs.util; import java.text.ParseException; import java.text.Simple ...

  9. 《C++primerplus》第12章练习题

    做一下倒数两题,都是在队列模拟的程序基础上做点修改测试. 5.找出平均等候时间为1分钟时,每小时到达的客户数为多少(试验时间不少于100小时). 指定队伍最大长度10人,模拟100小时.粗略估计答案在 ...

  10. Tensorflow学习笔记No.2

    使用函数式API构建神经网络 函数式API相比于keras.Sequential()具有更加灵活多变的特点. 函数式API主要应用于多输入多输出的网络模型. 利用函数式API构建神经网络主要分为3步, ...