|
| 1 | +# go-extend |
| 2 | + |
1 | 3 | [](http://godoc.org/github.com/thinkeridea/go-extend) |
2 | 4 | [](https://travis-ci.org/thinkeridea/go-extend) |
3 | 5 | [](https://codecov.io/gh/thinkeridea/go-extend) |
4 | 6 | [](https://goreportcard.com/report/github.com/thinkeridea/go-extend) |
5 | 7 |
|
6 | | -# go-extend 收集一些常用的操作函数,辅助更快的完成开发工作,并减少重复代码 |
| 8 | +go-extend 收集一些常用的操作函数,辅助更快的完成开发工作,并减少重复代码。 |
7 | 9 |
|
8 | 10 | 它收集各种杂项函数,并进行归类,方便使用者查找,它可以大幅度提升开发效率和程序运行性能。它以保证性能为最大前提,提供有效的方法。 |
9 | 11 | 针对一些标准库中的函数或者库进行一些修改,使其性能大幅度提升,但它并不用来替换标准库函数,这些函数往往会在一些场景下有效,但有些函数可以用来替换标准库函数,它们保持一致的功能,且相当安全。 |
10 | 12 |
|
11 | 13 | 一些包或者函数使用示例及分析可以在我的 [博客(https://blog.thinkeridea.com)](https://blog.thinkeridea.com) 中找到。 |
12 | 14 |
|
| 15 | +## 安装 |
| 16 | + |
| 17 | +```shell |
| 18 | +$ go get github.com/thinkeridea/go-extend/... |
| 19 | +``` |
| 20 | + |
13 | 21 | ## 规范: |
14 | 22 |
|
15 | 23 | - 与标准库包名一致的使用 `ex` 前缀, 避免与标准库包冲突 |
16 | 24 | - 包目录下 `doc.go` 作为包说明文档 |
17 | 25 |
|
| 26 | +## 性能测试 |
| 27 | + |
| 28 | +包中一些函数会进行性能测试,包括每次修订的性能对比,它们一般位于各自包下面的 `benchmark` 目录下,性能测试结果可以在 [benchmark.md](benchmark.md) 快速浏览。 |
| 29 | + |
18 | 30 | ## 标准库函数改进列表 |
19 | 31 |
|
20 | 32 | 用来替换标准库的函数,它们和标准库函数功能保持一致,并拥有更好的性能: |
|
40 | 52 | - [exbytes.ToString](https://godoc.org/github.com/thinkeridea/go-extend/exbytes#ToString) 结合 `unsafe` 使 `[]byte` 转 `string` 没有成本 |
41 | 53 | - [exbytes.Replace](https://godoc.org/github.com/thinkeridea/go-extend/exbytes#Replace) 它使用原地替换,直接修改输入的数据,获得更好的性能 |
42 | 54 | - [exbytes.Reverse](https://godoc.org/github.com/thinkeridea/go-extend/exbytes#Reverse) 原地反转 []byte |
| 55 | +- [exbytes.Sub](https://godoc.org/github.com/thinkeridea/go-extend/exbytes#Sub) 是 [exutf8.RuneSub](https://godoc.org/github.com/thinkeridea/go-extend/exunicode/exutf8#RuneSub) 的别名,提供字符数量截取字节数组的方法 |
43 | 56 |
|
44 | 57 | ### [exstrings](https://godoc.org/github.com/thinkeridea/go-extend/exstrings) |
45 | 58 |
|
46 | 59 | 标准库 `strings` 的扩展包,提供一些高效的 `string` 操作方法。 |
47 | 60 |
|
48 | 61 | - [exstrings.UnsafeToBytes](https://godoc.org/github.com/thinkeridea/go-extend/exstrings#UnsafeToBytes) 结合 `unsafe` 使 `string` 转 `[]byte` 没有成本,但是字面量字符串转换后不可修改,否则会出现严重错误 |
| 62 | +- [exstrings.Bytes](https://godoc.org/github.com/thinkeridea/go-extend/exstrings#Bytes) 把字符串转换成 []byte 类型,和 []byte(s) 操作结果一致,但是效率更高 |
49 | 63 | - [exstrings.Copy](https://godoc.org/github.com/thinkeridea/go-extend/exstrings#Copy) 拷贝一个字符串,在截取字符串之后,避免得到大字符串引用导致内存泄漏 |
| 64 | +- [exstrings.SubString](https://godoc.org/github.com/thinkeridea/go-extend/exstrings#SubString) 是 [exutf8.RuneSubString](https://godoc.org/github.com/thinkeridea/go-extend/exunicode/exutf8#RuneSubString) 的别名,根据字符数量截取字符串的方法 |
50 | 65 | - [exstrings.Join](https://godoc.org/github.com/thinkeridea/go-extend/exstrings#Join) 该方法是对标准库 strings.Join 修改,配合 unsafe 包能有效减少内存分配 |
51 | 66 | - [exstrings.JoinToBytes](https://godoc.org/github.com/thinkeridea/go-extend/exstrings#JoinToBytes) 它响应一个 `[]byte` 类型,有效避免类型转换 |
52 | 67 | - [exstrings.Repeat](https://godoc.org/github.com/thinkeridea/go-extend/exstrings#Repeat) 该方法是对标准库 strings.Repeat 修改,对于创建大字符串能有效减少内存分配 |
|
84 | 99 |
|
85 | 100 | ### [exnet](https://godoc.org/github.com/thinkeridea/go-extend/exnet) |
86 | 101 |
|
87 | | -标准库 `exnet` 的扩展包,提供一些常用的操作函数。 |
| 102 | +标准库 `net` 的扩展包,提供一些常用的操作函数。 |
88 | 103 |
|
89 | 104 | - [exnet.HasLocalIPddr](https://godoc.org/github.com/thinkeridea/go-extend/exnet#HasLocalIPddr) 检查一个ip是否是内网ip |
90 | 105 | - [exnet.HasLocalIP](https://godoc.org/github.com/thinkeridea/go-extend/exnet#HasLocalIP) 检查一个ip对象是否是内网ip |
|
96 | 111 | - [exnet.Long2IPString](https://godoc.org/github.com/thinkeridea/go-extend/exnet#Long2IPString) 把数值转为ip字符串 |
97 | 112 | - [exnet.Long2IP](https://godoc.org/github.com/thinkeridea/go-extend/exnet#Long2IP) 把数值转为net.IP |
98 | 113 |
|
| 114 | +### [exutf8](https://godoc.org/github.com/thinkeridea/go-extend/exunicode/exutf8) |
| 115 | + |
| 116 | +标准库 `utf8` 的扩展包,提供一些高效处理多字节字符的方法。 |
| 117 | + |
| 118 | +- [exutf8.RuneIndex](https://godoc.org/github.com/thinkeridea/go-extend/exunicode/exutf8#RuneIndex) 计算指定字符数量的字节索引位置 |
| 119 | +- [exutf8.RuneIndexInString](https://godoc.org/github.com/thinkeridea/go-extend/exunicode/exutf8#RuneIndexInString) 计算指定字符数量的字符串索引位置 |
| 120 | +- [exutf8.RuneSub](https://godoc.org/github.com/thinkeridea/go-extend/exunicode/exutf8#RuneSub) 多字节字符截取方法 |
| 121 | +- [exutf8.RuneSubString](https://godoc.org/github.com/thinkeridea/go-extend/exunicode/exutf8#RuneSubString) 多字节字符串截取 |
| 122 | + |
99 | 123 | ### [exatomic](https://godoc.org/github.com/thinkeridea/go-extend/exatomic) |
100 | 124 |
|
101 | 125 | 一个浮点数的原子包, 支持 `float32` 和 `float64` 类型,鉴于浮点数的精度可能会有些意外,详细查看包文档或浮点数算法。 |
|
151 | 175 | - [Record.ArrayFieldJoin](https://godoc.org/github.com/thinkeridea/go-extend/datalog#Record.ArrayFieldJoin) 使用 fieldSep 连接 Record,其结果作为一个数组的单元 |
152 | 176 | - [Record.UnsafeArrayFieldJoin](https://godoc.org/github.com/thinkeridea/go-extend/datalog#Record.UnsafeArrayFieldJoin) 使用 fieldSep 连接 Record,其结果作为一个数组的单元,会使用 `unsafe` 包减少内存分配 |
153 | 177 |
|
154 | | -## 标准库函数改进性能测试: |
155 | | - |
156 | | -- [exstrings](exstrings/) |
157 | | - |
158 | | - - Replace 系列函数测试报告 |
159 | | - |
160 | | - ``` |
161 | | - goos: darwin |
162 | | - goarch: amd64 |
163 | | - pkg: github.com/thinkeridea/go-extend/exstrings/benchmark |
164 | | - BenchmarkReplace-8 500000 3256 ns/op 960 B/op 15 allocs/op |
165 | | - BenchmarkReplaceToBytes-8 500000 3283 ns/op 1024 B/op 16 allocs/op |
166 | | - BenchmarkUnsafeReplaceToBytes-8 500000 3041 ns/op 960 B/op 15 allocs/op |
167 | | - BenchmarkStandardLibraryReplace-8 500000 3679 ns/op 1920 B/op 30 allocs/op |
168 | | - PASS |
169 | | - ok github.com/thinkeridea/go-extend/exstrings/benchmark 7.769s |
170 | | - ``` |
171 | | - |
172 | | - - Repeat 性能测试报告 |
173 | | - |
174 | | - ``` |
175 | | - goos: darwin |
176 | | - goarch: amd64 |
177 | | - pkg: github.com/thinkeridea/go-extend/exstrings/benchmark |
178 | | - BenchmarkRepeat-8 50000 28818 ns/op 303104 B/op 1 allocs/op |
179 | | - BenchmarkRepeatToBytes-8 50000 28104 ns/op 303104 B/op 1 allocs/op |
180 | | - BenchmarkStandardLibraryRepeat-8 20000 51968 ns/op 606208 B/op 2 allocs/op |
181 | | - PASS |
182 | | - ok github.com/thinkeridea/go-extend/exstrings/benchmark 6.200s |
183 | | - ``` |
184 | | - |
185 | | - - Join 性能测试报告 |
186 | | - |
187 | | - ``` |
188 | | - goos: darwin |
189 | | - goarch: amd64 |
190 | | - pkg: github.com/thinkeridea/go-extend/exstrings/benchmark |
191 | | - BenchmarkJoin-8 5000000 290 ns/op 64 B/op 1 allocs/op |
192 | | - BenchmarkJoinToBytes-8 5000000 290 ns/op 64 B/op 1 allocs/op |
193 | | - BenchmarkStandardLibraryJoin-8 5000000 315 ns/op 128 B/op 2 allocs/op |
194 | | - PASS |
195 | | - ok github.com/thinkeridea/go-extend/exstrings/benchmark 5.406s |
196 | | - ``` |
197 | | - |
198 | 178 | ## 许可 |
199 | 179 |
|
200 | 180 | go-extend 根据 [GNU General Public License v3.0](https://www.gnu.org/licenses/) 许可证授权,有关完整许可证文本,请参阅 [LICENSE](LICENSE) |
0 commit comments