mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-08 06:32:28 +08:00
Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac0fb5ef25 | ||
|
|
9bd1c205fe | ||
|
|
6ccf9fd3cf | ||
|
|
c02ef2c62d | ||
|
|
6414031754 | ||
|
|
5336130570 | ||
|
|
bfa46d46a2 | ||
|
|
aab28b914c | ||
|
|
336e454ce7 | ||
|
|
35a50bd792 | ||
|
|
2fd23f02f6 | ||
|
|
aad5b447c9 | ||
|
|
cece13e929 | ||
|
|
ecf325a06c | ||
|
|
44370aef5e | ||
|
|
1782b11ec4 | ||
|
|
fe6495123c | ||
|
|
d442f564ce | ||
|
|
f35446cc13 | ||
|
|
506a8b4776 | ||
|
|
47ecfbfd5f | ||
|
|
82f7401368 | ||
|
|
068c878d1e | ||
|
|
47b2402345 | ||
|
|
a245716f99 | ||
|
|
71c85bb8f0 | ||
|
|
5edafec393 | ||
|
|
957878dd98 | ||
|
|
12e979cf3c | ||
|
|
ded42f8ff5 | ||
|
|
d06cde3fcf | ||
|
|
9cd8bfb8e0 | ||
|
|
51c9877224 | ||
|
|
f7f6427919 | ||
|
|
56b6844a2d | ||
|
|
cce56f0479 | ||
|
|
3dbd7d8980 | ||
|
|
3625921912 |
13
README.md
13
README.md
@@ -4,7 +4,7 @@
|
|||||||
<br/>
|
<br/>
|
||||||
|
|
||||||

|

|
||||||
[](https://github.com/duke-git/lancet/releases)
|
[](https://github.com/duke-git/lancet/releases)
|
||||||
[](https://pkg.go.dev/github.com/duke-git/lancet/v2)
|
[](https://pkg.go.dev/github.com/duke-git/lancet/v2)
|
||||||
[](https://goreportcard.com/report/github.com/duke-git/lancet/v2)
|
[](https://goreportcard.com/report/github.com/duke-git/lancet/v2)
|
||||||
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
|
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
|
||||||
@@ -118,12 +118,15 @@ import "github.com/duke-git/lancet/v2/convertor"
|
|||||||
- [ToBool](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToBool)
|
- [ToBool](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToBool)
|
||||||
- [ToBytes](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToBytes)
|
- [ToBytes](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToBytes)
|
||||||
- [ToChar](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToChar)
|
- [ToChar](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToChar)
|
||||||
|
- [ToChannel](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToChannel)
|
||||||
- [ToFloat](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToFloat)
|
- [ToFloat](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToFloat)
|
||||||
- [ToInt](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToInt)
|
- [ToInt](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToInt)
|
||||||
- [ToJson](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToJson)
|
- [ToJson](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToJson)
|
||||||
|
- [ToMap](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToMap)
|
||||||
- [ToPointer](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToPointer)
|
- [ToPointer](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToPointer)
|
||||||
- [ToString](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToString)
|
- [ToString](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#ToString)
|
||||||
- [StructToMap](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#StructToMap)
|
- [StructToMap](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#StructToMap)
|
||||||
|
- [MapToSlice](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#MapToSlice)
|
||||||
|
|
||||||
### 4. Cryptor package is for data encryption and decryption.
|
### 4. Cryptor package is for data encryption and decryption.
|
||||||
|
|
||||||
@@ -289,6 +292,7 @@ import "github.com/duke-git/lancet/v2/maputil"
|
|||||||
- [Merge](https://github.com/duke-git/lancet/blob/main/docs/maputil.md#Merge)
|
- [Merge](https://github.com/duke-git/lancet/blob/main/docs/maputil.md#Merge)
|
||||||
- [Minus](https://github.com/duke-git/lancet/blob/main/docs/maputil.md#Minus)
|
- [Minus](https://github.com/duke-git/lancet/blob/main/docs/maputil.md#Minus)
|
||||||
- [Values](https://github.com/duke-git/lancet/blob/main/docs/maputil.md#Values)
|
- [Values](https://github.com/duke-git/lancet/blob/main/docs/maputil.md#Values)
|
||||||
|
- [IsDisjoint](https://github.com/duke-git/lancet/blob/main/docs/maputil.md#IsDisjoint)
|
||||||
|
|
||||||
|
|
||||||
### 11. Mathutil package implements some functions for math calculation.
|
### 11. Mathutil package implements some functions for math calculation.
|
||||||
@@ -320,11 +324,14 @@ import "github.com/duke-git/lancet/v2/netutil"
|
|||||||
|
|
||||||
#### Function list:
|
#### Function list:
|
||||||
- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ConvertMapToQueryString)
|
- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ConvertMapToQueryString)
|
||||||
|
- [EncodeUrl](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#EncodeUrl)
|
||||||
- [GetInternalIp](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetInternalIp)
|
- [GetInternalIp](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetInternalIp)
|
||||||
- [GetIps](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps)
|
- [GetIps](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps)
|
||||||
- [GetMacAddrs](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs)
|
- [GetMacAddrs](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs)
|
||||||
- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetPublicIpInfo)
|
- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetPublicIpInfo)
|
||||||
|
- [GetRequestPublicIp](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetRequestPublicIp)
|
||||||
- [IsPublicIP](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsPublicIP)
|
- [IsPublicIP](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsPublicIP)
|
||||||
|
- [IsInternalIP](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsInternalIP)
|
||||||
- [HttpGet](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpGet)
|
- [HttpGet](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpGet)
|
||||||
- [HttpDelete](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpDelete)
|
- [HttpDelete](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpDelete)
|
||||||
- [HttpPost](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPost)
|
- [HttpPost](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPost)
|
||||||
@@ -381,7 +388,8 @@ import "github.com/duke-git/lancet/v2/slice"
|
|||||||
- [Filter](https://github.com/duke-git/lancet/blob/main/docs/slice.md#Filter)
|
- [Filter](https://github.com/duke-git/lancet/blob/main/docs/slice.md#Filter)
|
||||||
- [Find](https://github.com/duke-git/lancet/blob/main/docs/slice.md#Find)
|
- [Find](https://github.com/duke-git/lancet/blob/main/docs/slice.md#Find)
|
||||||
- [FindLast](https://github.com/duke-git/lancet/blob/main/docs/slice.md#FindLast)
|
- [FindLast](https://github.com/duke-git/lancet/blob/main/docs/slice.md#FindLast)
|
||||||
- [FlattenDeep](#FlattenDeep)
|
- [Flatten](https://github.com/duke-git/lancet/blob/main/docs/slice.md#Flatten)
|
||||||
|
- [FlattenDeep](https://github.com/duke-git/lancet/blob/main/docs/slice.md#FlattenDeep)
|
||||||
- [ForEach](https://github.com/duke-git/lancet/blob/main/docs/slice.md#ForEach)
|
- [ForEach](https://github.com/duke-git/lancet/blob/main/docs/slice.md#ForEach)
|
||||||
- [GroupBy](https://github.com/duke-git/lancet/blob/main/docs/slice.md#GroupBy)
|
- [GroupBy](https://github.com/duke-git/lancet/blob/main/docs/slice.md#GroupBy)
|
||||||
- [GroupWith](https://github.com/duke-git/lancet/blob/main/docs/slice.md#GroupWith)
|
- [GroupWith](https://github.com/duke-git/lancet/blob/main/docs/slice.md#GroupWith)
|
||||||
@@ -446,6 +454,7 @@ import "github.com/duke-git/lancet/v2/system"
|
|||||||
- [RemoveOsEnv](https://github.com/duke-git/lancet/blob/main/docs/system.md#RemoveOsEnv)
|
- [RemoveOsEnv](https://github.com/duke-git/lancet/blob/main/docs/system.md#RemoveOsEnv)
|
||||||
- [CompareOsEnv](https://github.com/duke-git/lancet/blob/main/docs/system.md#CompareOsEnv)
|
- [CompareOsEnv](https://github.com/duke-git/lancet/blob/main/docs/system.md#CompareOsEnv)
|
||||||
- [ExecCommand](https://github.com/duke-git/lancet/blob/main/docs/system.md#ExecCommand)
|
- [ExecCommand](https://github.com/duke-git/lancet/blob/main/docs/system.md#ExecCommand)
|
||||||
|
- [GetOsBits](https://github.com/duke-git/lancet/blob/main/docs/system.md#GetOsBits)
|
||||||
|
|
||||||
### 18. Validator package contains some functions for data validation.
|
### 18. Validator package contains some functions for data validation.
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<br/>
|
<br/>
|
||||||
|
|
||||||

|

|
||||||
[](https://github.com/duke-git/lancet/releases)
|
[](https://github.com/duke-git/lancet/releases)
|
||||||
[](https://pkg.go.dev/github.com/duke-git/lancet/v2)
|
[](https://pkg.go.dev/github.com/duke-git/lancet/v2)
|
||||||
[](https://goreportcard.com/report/github.com/duke-git/lancet/v2)
|
[](https://goreportcard.com/report/github.com/duke-git/lancet/v2)
|
||||||
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
|
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
|
||||||
@@ -117,13 +117,15 @@ import "github.com/duke-git/lancet/v2/convertor"
|
|||||||
- [ToBool](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToBool)
|
- [ToBool](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToBool)
|
||||||
- [ToBytes](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToBytes)
|
- [ToBytes](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToBytes)
|
||||||
- [ToChar](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToChar)
|
- [ToChar](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToChar)
|
||||||
|
- [ToChannel](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToChannel)
|
||||||
- [ToFloat](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToFloat)
|
- [ToFloat](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToFloat)
|
||||||
- [ToInt](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToInt)
|
- [ToInt](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToInt)
|
||||||
- [ToJson](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToJson)
|
- [ToJson](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToJson)
|
||||||
|
- [ToMap](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToMap)
|
||||||
- [ToPointer](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToPointer)
|
- [ToPointer](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToPointer)
|
||||||
- [ToString](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToString)
|
- [ToString](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#ToString)
|
||||||
- [StructToMap](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#StructToMap)
|
- [StructToMap](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#StructToMap)
|
||||||
|
- [MapToSlice](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#MapToSlice)
|
||||||
### 4. cryptor加密包支持数据加密和解密,获取md5,hash值。支持base64, md5, hmac, aes, des, rsa。
|
### 4. cryptor加密包支持数据加密和解密,获取md5,hash值。支持base64, md5, hmac, aes, des, rsa。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
@@ -288,6 +290,7 @@ import "github.com/duke-git/lancet/v2/maputil"
|
|||||||
- [Merge](https://github.com/duke-git/lancet/blob/main/docs/maputil_zh-CN.md#Merge)
|
- [Merge](https://github.com/duke-git/lancet/blob/main/docs/maputil_zh-CN.md#Merge)
|
||||||
- [Minus](https://github.com/duke-git/lancet/blob/main/docs/maputil_zh-CN.md#Minus)
|
- [Minus](https://github.com/duke-git/lancet/blob/main/docs/maputil_zh-CN.md#Minus)
|
||||||
- [Values](https://github.com/duke-git/lancet/blob/main/docs/maputil_zh-CN.md#Values)
|
- [Values](https://github.com/duke-git/lancet/blob/main/docs/maputil_zh-CN.md#Values)
|
||||||
|
- [IsDisjoint](https://github.com/duke-git/lancet/blob/main/docs/maputil_zh-CN.md#IsDisjoint)
|
||||||
|
|
||||||
### 11. mathutil包实现了一些数学计算的函数。
|
### 11. mathutil包实现了一些数学计算的函数。
|
||||||
|
|
||||||
@@ -318,10 +321,13 @@ import "github.com/duke-git/lancet/v2/netutil"
|
|||||||
#### 函数列表:
|
#### 函数列表:
|
||||||
- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ConvertMapToQueryString)
|
- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ConvertMapToQueryString)
|
||||||
- [GetInternalIp](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetInternalIp)
|
- [GetInternalIp](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetInternalIp)
|
||||||
|
- [EncodeUrl](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#EncodeUrl)
|
||||||
- [GetIps](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps)
|
- [GetIps](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps)
|
||||||
- [GetMacAddrs](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs)
|
- [GetMacAddrs](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs)
|
||||||
- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetPublicIpInfo)
|
- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetPublicIpInfo)
|
||||||
|
- [GetRequestPublicIp](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetRequestPublicIp)
|
||||||
- [IsPublicIP](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsPublicIP)
|
- [IsPublicIP](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsPublicIP)
|
||||||
|
- [IsInternalIP](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsInternalIP)
|
||||||
- [HttpGet](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpGet)
|
- [HttpGet](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpGet)
|
||||||
- [HttpDelete](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpDelete)
|
- [HttpDelete](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpDelete)
|
||||||
- [HttpPost](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPost)
|
- [HttpPost](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPost)
|
||||||
@@ -376,7 +382,8 @@ import "github.com/duke-git/lancet/v2/slice"
|
|||||||
- [Filter](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#Filter)
|
- [Filter](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#Filter)
|
||||||
- [Find](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#Find)
|
- [Find](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#Find)
|
||||||
- [FindLast](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#FindLast)
|
- [FindLast](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#FindLast)
|
||||||
- [FlattenDeep](#FlattenDeep)
|
- [Flatten](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#Flatten)
|
||||||
|
- [FlattenDeep](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#FlattenDeep)
|
||||||
- [ForEach](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#ForEach)
|
- [ForEach](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#ForEach)
|
||||||
- [GroupBy](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#GroupBy)
|
- [GroupBy](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#GroupBy)
|
||||||
- [GroupWith](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#GroupWith)
|
- [GroupWith](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#GroupWith)
|
||||||
@@ -445,6 +452,7 @@ import "github.com/duke-git/lancet/v2/system"
|
|||||||
- [RemoveOsEnv](https://github.com/duke-git/lancet/blob/main/docs/system_zh-CN.md#RemoveOsEnv)
|
- [RemoveOsEnv](https://github.com/duke-git/lancet/blob/main/docs/system_zh-CN.md#RemoveOsEnv)
|
||||||
- [CompareOsEnv](https://github.com/duke-git/lancet/blob/main/docs/system_zh-CN.md#CompareOsEnv)
|
- [CompareOsEnv](https://github.com/duke-git/lancet/blob/main/docs/system_zh-CN.md#CompareOsEnv)
|
||||||
- [ExecCommand](https://github.com/duke-git/lancet/blob/main/docs/system_zh-CN.md#ExecCommand)
|
- [ExecCommand](https://github.com/duke-git/lancet/blob/main/docs/system_zh-CN.md#ExecCommand)
|
||||||
|
- [GetOsBits](https://github.com/duke-git/lancet/blob/main/docs/system_zh-CN.md#GetOsBits)
|
||||||
|
|
||||||
### 18. validator验证器包,包含常用字符串格式验证函数。
|
### 18. validator验证器包,包含常用字符串格式验证函数。
|
||||||
|
|
||||||
|
|||||||
@@ -74,72 +74,86 @@ func ToChar(s string) []string {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToChannel convert a array of elements to a read-only channels
|
||||||
|
func ToChannel[T any](array []T) <-chan T {
|
||||||
|
ch := make(chan T)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for _, item := range array {
|
||||||
|
ch <- item
|
||||||
|
}
|
||||||
|
close(ch)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
// ToString convert value to string
|
// ToString convert value to string
|
||||||
func ToString(value any) string {
|
func ToString(value any) string {
|
||||||
res := ""
|
result := ""
|
||||||
if value == nil {
|
if value == nil {
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
v := reflect.ValueOf(value)
|
v := reflect.ValueOf(value)
|
||||||
|
|
||||||
switch value.(type) {
|
switch value.(type) {
|
||||||
case float32, float64:
|
case float32, float64:
|
||||||
res = strconv.FormatFloat(v.Float(), 'f', -1, 64)
|
result = strconv.FormatFloat(v.Float(), 'f', -1, 64)
|
||||||
return res
|
return result
|
||||||
case int, int8, int16, int32, int64:
|
case int, int8, int16, int32, int64:
|
||||||
res = strconv.FormatInt(v.Int(), 10)
|
result = strconv.FormatInt(v.Int(), 10)
|
||||||
return res
|
return result
|
||||||
case uint, uint8, uint16, uint32, uint64:
|
case uint, uint8, uint16, uint32, uint64:
|
||||||
res = strconv.FormatUint(v.Uint(), 10)
|
result = strconv.FormatUint(v.Uint(), 10)
|
||||||
return res
|
return result
|
||||||
case string:
|
case string:
|
||||||
res = v.String()
|
result = v.String()
|
||||||
return res
|
return result
|
||||||
case []byte:
|
case []byte:
|
||||||
res = string(v.Bytes())
|
result = string(v.Bytes())
|
||||||
return res
|
return result
|
||||||
default:
|
default:
|
||||||
newValue, _ := json.Marshal(value)
|
newValue, _ := json.Marshal(value)
|
||||||
res = string(newValue)
|
result = string(newValue)
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToJson convert value to a valid json string
|
// ToJson convert value to a valid json string
|
||||||
func ToJson(value any) (string, error) {
|
func ToJson(value any) (string, error) {
|
||||||
res, err := json.Marshal(value)
|
result, err := json.Marshal(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return string(res), nil
|
return string(result), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToFloat convert value to a float64, if input is not a float return 0.0 and error
|
// ToFloat convert value to a float64, if input is not a float return 0.0 and error
|
||||||
func ToFloat(value any) (float64, error) {
|
func ToFloat(value any) (float64, error) {
|
||||||
v := reflect.ValueOf(value)
|
v := reflect.ValueOf(value)
|
||||||
|
|
||||||
res := 0.0
|
result := 0.0
|
||||||
err := fmt.Errorf("ToInt: unvalid interface type %T", value)
|
err := fmt.Errorf("ToInt: unvalid interface type %T", value)
|
||||||
switch value.(type) {
|
switch value.(type) {
|
||||||
case int, int8, int16, int32, int64:
|
case int, int8, int16, int32, int64:
|
||||||
res = float64(v.Int())
|
result = float64(v.Int())
|
||||||
return res, nil
|
return result, nil
|
||||||
case uint, uint8, uint16, uint32, uint64:
|
case uint, uint8, uint16, uint32, uint64:
|
||||||
res = float64(v.Uint())
|
result = float64(v.Uint())
|
||||||
return res, nil
|
return result, nil
|
||||||
case float32, float64:
|
case float32, float64:
|
||||||
res = v.Float()
|
result = v.Float()
|
||||||
return res, nil
|
return result, nil
|
||||||
case string:
|
case string:
|
||||||
res, err = strconv.ParseFloat(v.String(), 64)
|
result, err = strconv.ParseFloat(v.String(), 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
res = 0.0
|
result = 0.0
|
||||||
}
|
}
|
||||||
return res, err
|
return result, err
|
||||||
default:
|
default:
|
||||||
return res, err
|
return result, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,26 +161,26 @@ func ToFloat(value any) (float64, error) {
|
|||||||
func ToInt(value any) (int64, error) {
|
func ToInt(value any) (int64, error) {
|
||||||
v := reflect.ValueOf(value)
|
v := reflect.ValueOf(value)
|
||||||
|
|
||||||
var res int64
|
var result int64
|
||||||
err := fmt.Errorf("ToInt: invalid interface type %T", value)
|
err := fmt.Errorf("ToInt: invalid interface type %T", value)
|
||||||
switch value.(type) {
|
switch value.(type) {
|
||||||
case int, int8, int16, int32, int64:
|
case int, int8, int16, int32, int64:
|
||||||
res = v.Int()
|
result = v.Int()
|
||||||
return res, nil
|
return result, nil
|
||||||
case uint, uint8, uint16, uint32, uint64:
|
case uint, uint8, uint16, uint32, uint64:
|
||||||
res = int64(v.Uint())
|
result = int64(v.Uint())
|
||||||
return res, nil
|
return result, nil
|
||||||
case float32, float64:
|
case float32, float64:
|
||||||
res = int64(v.Float())
|
result = int64(v.Float())
|
||||||
return res, nil
|
return result, nil
|
||||||
case string:
|
case string:
|
||||||
res, err = strconv.ParseInt(v.String(), 0, 64)
|
result, err = strconv.ParseInt(v.String(), 0, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
res = 0
|
result = 0
|
||||||
}
|
}
|
||||||
return res, err
|
return result, err
|
||||||
default:
|
default:
|
||||||
return res, err
|
return result, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,6 +189,17 @@ func ToPointer[T any](value T) *T {
|
|||||||
return &value
|
return &value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToMap convert a slice or an array of structs to a map based on iteratee function
|
||||||
|
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V {
|
||||||
|
result := make(map[K]V, len(array))
|
||||||
|
for _, item := range array {
|
||||||
|
k, v := iteratee(item)
|
||||||
|
result[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
// StructToMap convert struct to map, only convert exported struct field
|
// StructToMap convert struct to map, only convert exported struct field
|
||||||
// map key is specified same as struct field tag `json` value
|
// map key is specified same as struct field tag `json` value
|
||||||
func StructToMap(value any) (map[string]any, error) {
|
func StructToMap(value any) (map[string]any, error) {
|
||||||
@@ -188,7 +213,7 @@ func StructToMap(value any) (map[string]any, error) {
|
|||||||
return nil, fmt.Errorf("data type %T not support, shuld be struct or pointer to struct", value)
|
return nil, fmt.Errorf("data type %T not support, shuld be struct or pointer to struct", value)
|
||||||
}
|
}
|
||||||
|
|
||||||
res := make(map[string]any)
|
result := make(map[string]any)
|
||||||
|
|
||||||
fieldNum := t.NumField()
|
fieldNum := t.NumField()
|
||||||
pattern := `^[A-Z]`
|
pattern := `^[A-Z]`
|
||||||
@@ -197,12 +222,23 @@ func StructToMap(value any) (map[string]any, error) {
|
|||||||
name := t.Field(i).Name
|
name := t.Field(i).Name
|
||||||
tag := t.Field(i).Tag.Get("json")
|
tag := t.Field(i).Tag.Get("json")
|
||||||
if regex.MatchString(name) && tag != "" {
|
if regex.MatchString(name) && tag != "" {
|
||||||
//res[name] = v.Field(i).Interface()
|
//result[name] = v.Field(i).Interface()
|
||||||
res[tag] = v.Field(i).Interface()
|
result[tag] = v.Field(i).Interface()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res, nil
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MapToSlice convert a map to a slice based on iteratee function
|
||||||
|
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T {
|
||||||
|
result := make([]T, 0, len(aMap))
|
||||||
|
|
||||||
|
for k, v := range aMap {
|
||||||
|
result = append(result, iteratee(k, v))
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// ColorHexToRGB convert hex color to rgb color
|
// ColorHexToRGB convert hex color to rgb color
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package convertor
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/duke-git/lancet/v2/internal"
|
"github.com/duke-git/lancet/v2/internal"
|
||||||
@@ -21,6 +22,23 @@ func TestToChar(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestToChannel(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToChannel")
|
||||||
|
|
||||||
|
ch := ToChannel([]int{1, 2, 3})
|
||||||
|
val1, _ := <-ch
|
||||||
|
assert.Equal(1, val1)
|
||||||
|
|
||||||
|
val2, _ := <-ch
|
||||||
|
assert.Equal(2, val2)
|
||||||
|
|
||||||
|
val3, _ := <-ch
|
||||||
|
assert.Equal(3, val3)
|
||||||
|
|
||||||
|
_, ok := <-ch
|
||||||
|
assert.Equal(false, ok)
|
||||||
|
}
|
||||||
|
|
||||||
func TestToBool(t *testing.T) {
|
func TestToBool(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestToBool")
|
assert := internal.NewAssert(t, "TestToBool")
|
||||||
|
|
||||||
@@ -142,6 +160,25 @@ func TestToJson(t *testing.T) {
|
|||||||
assert.Equal("{\"Name\":\"TestStruct\"}", structJsonStr)
|
assert.Equal("{\"Name\":\"TestStruct\"}", structJsonStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestToMap(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToMap")
|
||||||
|
|
||||||
|
type Message struct {
|
||||||
|
name string
|
||||||
|
code int
|
||||||
|
}
|
||||||
|
messages := []Message{
|
||||||
|
{name: "Hello", code: 100},
|
||||||
|
{name: "Hi", code: 101},
|
||||||
|
}
|
||||||
|
result := ToMap(messages, func(msg Message) (int, string) {
|
||||||
|
return msg.code, msg.name
|
||||||
|
})
|
||||||
|
expected := map[int]string{100: "Hello", 101: "Hi"}
|
||||||
|
|
||||||
|
assert.Equal(expected, result)
|
||||||
|
}
|
||||||
|
|
||||||
func TestStructToMap(t *testing.T) {
|
func TestStructToMap(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestStructToMap")
|
assert := internal.NewAssert(t, "TestStructToMap")
|
||||||
|
|
||||||
@@ -154,10 +191,22 @@ func TestStructToMap(t *testing.T) {
|
|||||||
100,
|
100,
|
||||||
}
|
}
|
||||||
pm, _ := StructToMap(p)
|
pm, _ := StructToMap(p)
|
||||||
var expected = map[string]any{"name": "test"}
|
|
||||||
|
expected := map[string]any{"name": "test"}
|
||||||
assert.Equal(expected, pm)
|
assert.Equal(expected, pm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMapToSlice(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestMapToSlice")
|
||||||
|
|
||||||
|
aMap := map[string]int{"a": 1, "b": 2, "c": 3}
|
||||||
|
result := MapToSlice(aMap, func(key string, value int) string {
|
||||||
|
return key + ":" + strconv.Itoa(value)
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.Equal([]string{"a:1", "b:2", "c:3"}, result)
|
||||||
|
}
|
||||||
|
|
||||||
func TestColorHexToRGB(t *testing.T) {
|
func TestColorHexToRGB(t *testing.T) {
|
||||||
colorHex := "#003366"
|
colorHex := "#003366"
|
||||||
r, g, b := ColorHexToRGB(colorHex)
|
r, g, b := ColorHexToRGB(colorHex)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func AesEcbEncrypt(data, key []byte) []byte {
|
|||||||
func AesEcbDecrypt(encrypted, key []byte) []byte {
|
func AesEcbDecrypt(encrypted, key []byte) []byte {
|
||||||
cipher, _ := aes.NewCipher(generateAesKey(key))
|
cipher, _ := aes.NewCipher(generateAesKey(key))
|
||||||
decrypted := make([]byte, len(encrypted))
|
decrypted := make([]byte, len(encrypted))
|
||||||
//
|
|
||||||
for bs, be := 0, cipher.BlockSize(); bs < len(encrypted); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
|
for bs, be := 0, cipher.BlockSize(); bs < len(encrypted); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
|
||||||
cipher.Decrypt(decrypted[bs:be], encrypted[bs:be])
|
cipher.Decrypt(decrypted[bs:be], encrypted[bs:be])
|
||||||
}
|
}
|
||||||
@@ -54,14 +54,18 @@ func AesEcbDecrypt(encrypted, key []byte) []byte {
|
|||||||
// AesCbcEncrypt encrypt data with key use AES CBC algorithm
|
// AesCbcEncrypt encrypt data with key use AES CBC algorithm
|
||||||
// len(key) should be 16, 24 or 32
|
// len(key) should be 16, 24 or 32
|
||||||
func AesCbcEncrypt(data, key []byte) []byte {
|
func AesCbcEncrypt(data, key []byte) []byte {
|
||||||
// len(key) should be 16, 24 or 32
|
|
||||||
block, _ := aes.NewCipher(key)
|
block, _ := aes.NewCipher(key)
|
||||||
blockSize := block.BlockSize()
|
data = pkcs7Padding(data, block.BlockSize())
|
||||||
data = pkcs7Padding(data, blockSize)
|
|
||||||
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
|
encrypted := make([]byte, aes.BlockSize+len(data))
|
||||||
|
iv := encrypted[:aes.BlockSize]
|
||||||
|
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
mode := cipher.NewCBCEncrypter(block, iv)
|
||||||
|
mode.CryptBlocks(encrypted[aes.BlockSize:], data)
|
||||||
|
|
||||||
encrypted := make([]byte, len(data))
|
|
||||||
blockMode.CryptBlocks(encrypted, data)
|
|
||||||
return encrypted
|
return encrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,12 +73,14 @@ func AesCbcEncrypt(data, key []byte) []byte {
|
|||||||
// len(key) should be 16, 24 or 32
|
// len(key) should be 16, 24 or 32
|
||||||
func AesCbcDecrypt(encrypted, key []byte) []byte {
|
func AesCbcDecrypt(encrypted, key []byte) []byte {
|
||||||
block, _ := aes.NewCipher(key)
|
block, _ := aes.NewCipher(key)
|
||||||
blockSize := block.BlockSize()
|
|
||||||
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
|
|
||||||
|
|
||||||
decrypted := make([]byte, len(encrypted))
|
iv := encrypted[:aes.BlockSize]
|
||||||
blockMode.CryptBlocks(decrypted, encrypted)
|
encrypted = encrypted[aes.BlockSize:]
|
||||||
decrypted = pkcs7UnPadding(decrypted)
|
|
||||||
|
mode := cipher.NewCBCDecrypter(block, iv)
|
||||||
|
mode.CryptBlocks(encrypted, encrypted)
|
||||||
|
|
||||||
|
decrypted := pkcs7UnPadding(encrypted)
|
||||||
return decrypted
|
return decrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,12 +55,16 @@ func DesEcbDecrypt(encrypted, key []byte) []byte {
|
|||||||
// len(key) should be 8
|
// len(key) should be 8
|
||||||
func DesCbcEncrypt(data, key []byte) []byte {
|
func DesCbcEncrypt(data, key []byte) []byte {
|
||||||
block, _ := des.NewCipher(key)
|
block, _ := des.NewCipher(key)
|
||||||
blockSize := block.BlockSize()
|
data = pkcs7Padding(data, block.BlockSize())
|
||||||
data = pkcs7Padding(data, blockSize)
|
|
||||||
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
|
|
||||||
|
|
||||||
encrypted := make([]byte, len(data))
|
encrypted := make([]byte, des.BlockSize+len(data))
|
||||||
blockMode.CryptBlocks(encrypted, data)
|
iv := encrypted[:des.BlockSize]
|
||||||
|
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
mode := cipher.NewCBCEncrypter(block, iv)
|
||||||
|
mode.CryptBlocks(encrypted[des.BlockSize:], data)
|
||||||
|
|
||||||
return encrypted
|
return encrypted
|
||||||
}
|
}
|
||||||
@@ -69,13 +73,14 @@ func DesCbcEncrypt(data, key []byte) []byte {
|
|||||||
// len(key) should be 8
|
// len(key) should be 8
|
||||||
func DesCbcDecrypt(encrypted, key []byte) []byte {
|
func DesCbcDecrypt(encrypted, key []byte) []byte {
|
||||||
block, _ := des.NewCipher(key)
|
block, _ := des.NewCipher(key)
|
||||||
blockSize := block.BlockSize()
|
|
||||||
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
|
|
||||||
|
|
||||||
decrypted := make([]byte, len(encrypted))
|
iv := encrypted[:des.BlockSize]
|
||||||
blockMode.CryptBlocks(decrypted, encrypted)
|
encrypted = encrypted[des.BlockSize:]
|
||||||
decrypted = pkcs7UnPadding(decrypted)
|
|
||||||
|
|
||||||
|
mode := cipher.NewCBCDecrypter(block, iv)
|
||||||
|
mode.CryptBlocks(encrypted, encrypted)
|
||||||
|
|
||||||
|
decrypted := pkcs7UnPadding(encrypted)
|
||||||
return decrypted
|
return decrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -208,13 +208,13 @@ func (link *DoublyLink[T]) Size() int {
|
|||||||
|
|
||||||
// Values return slice of all doubly linklist node value
|
// Values return slice of all doubly linklist node value
|
||||||
func (link *DoublyLink[T]) Values() []T {
|
func (link *DoublyLink[T]) Values() []T {
|
||||||
res := []T{}
|
result := []T{}
|
||||||
current := link.Head
|
current := link.Head
|
||||||
for current != nil {
|
for current != nil {
|
||||||
res = append(res, current.Value)
|
result = append(result, current.Value)
|
||||||
current = current.Next
|
current = current.Next
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print all nodes info of a linked list
|
// Print all nodes info of a linked list
|
||||||
|
|||||||
@@ -213,13 +213,13 @@ func (link *SinglyLink[T]) Size() int {
|
|||||||
|
|
||||||
// Values return slice of all singly linklist node value
|
// Values return slice of all singly linklist node value
|
||||||
func (link *SinglyLink[T]) Values() []T {
|
func (link *SinglyLink[T]) Values() []T {
|
||||||
res := []T{}
|
result := []T{}
|
||||||
current := link.Head
|
current := link.Head
|
||||||
for current != nil {
|
for current != nil {
|
||||||
res = append(res, current.Value)
|
result = append(result, current.Value)
|
||||||
current = current.Next
|
current = current.Next
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsEmpty checks if link is empty or not
|
// IsEmpty checks if link is empty or not
|
||||||
|
|||||||
@@ -222,24 +222,24 @@ func (l *List[T]) Unique() {
|
|||||||
|
|
||||||
// Union creates a new list contain all element in list l and other, remove duplicate element.
|
// Union creates a new list contain all element in list l and other, remove duplicate element.
|
||||||
func (l *List[T]) Union(other *List[T]) *List[T] {
|
func (l *List[T]) Union(other *List[T]) *List[T] {
|
||||||
res := NewList([]T{})
|
result := NewList([]T{})
|
||||||
|
|
||||||
res.data = append(res.data, l.data...)
|
result.data = append(result.data, l.data...)
|
||||||
res.data = append(res.data, other.data...)
|
result.data = append(result.data, other.data...)
|
||||||
res.Unique()
|
result.Unique()
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Intersection creates a new list whose element both be contained in list l and other
|
// Intersection creates a new list whose element both be contained in list l and other
|
||||||
func (l *List[T]) Intersection(other *List[T]) *List[T] {
|
func (l *List[T]) Intersection(other *List[T]) *List[T] {
|
||||||
res := NewList(make([]T, 0, 0))
|
result := NewList(make([]T, 0, 0))
|
||||||
|
|
||||||
for _, v := range l.data {
|
for _, v := range l.data {
|
||||||
if other.Contain(v) {
|
if other.Contain(v) {
|
||||||
res.data = append(res.data, v)
|
result.data = append(result.data, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,20 +84,20 @@ func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool {
|
|||||||
|
|
||||||
func hasSubTree[T any](superTreeRoot, subTreeRoot *datastructure.TreeNode[T],
|
func hasSubTree[T any](superTreeRoot, subTreeRoot *datastructure.TreeNode[T],
|
||||||
comparator lancetconstraints.Comparator) bool {
|
comparator lancetconstraints.Comparator) bool {
|
||||||
res := false
|
result := false
|
||||||
|
|
||||||
if superTreeRoot != nil && subTreeRoot != nil {
|
if superTreeRoot != nil && subTreeRoot != nil {
|
||||||
if comparator.Compare(superTreeRoot.Value, subTreeRoot.Value) == 0 {
|
if comparator.Compare(superTreeRoot.Value, subTreeRoot.Value) == 0 {
|
||||||
res = isSubTree(superTreeRoot, subTreeRoot, comparator)
|
result = isSubTree(superTreeRoot, subTreeRoot, comparator)
|
||||||
}
|
}
|
||||||
if !res {
|
if !result {
|
||||||
res = hasSubTree(superTreeRoot.Left, subTreeRoot, comparator)
|
result = hasSubTree(superTreeRoot.Left, subTreeRoot, comparator)
|
||||||
}
|
}
|
||||||
if !res {
|
if !result {
|
||||||
res = hasSubTree(superTreeRoot.Right, subTreeRoot, comparator)
|
result = hasSubTree(superTreeRoot.Right, subTreeRoot, comparator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print the bstree structure
|
// Print the bstree structure
|
||||||
|
|||||||
@@ -226,8 +226,8 @@ func isSubTree[T any](superTreeRoot, subTreeRoot *datastructure.TreeNode[T], com
|
|||||||
if comparator.Compare(superTreeRoot.Value, subTreeRoot.Value) != 0 {
|
if comparator.Compare(superTreeRoot.Value, subTreeRoot.Value) != 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
res := isSubTree(superTreeRoot.Left, subTreeRoot.Left, comparator) && isSubTree(superTreeRoot.Right, subTreeRoot.Right, comparator)
|
result := isSubTree(superTreeRoot.Left, subTreeRoot.Left, comparator) && isSubTree(superTreeRoot.Right, subTreeRoot.Right, comparator)
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func max(a, b int) int {
|
func max(a, b int) int {
|
||||||
|
|||||||
@@ -584,8 +584,8 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
cache := algorithm.NewLRUCache[int, int](2)
|
cache := algorithm.NewLRUCache[int, int](2)
|
||||||
|
|
||||||
cache.Put(1, 1)
|
cache.Put(1, 1)
|
||||||
cache.Put(2, 2)
|
cache.Put(2, 2)
|
||||||
|
|
||||||
_, ok := cache.Get(0) // ok -> false
|
_, ok := cache.Get(0) // ok -> false
|
||||||
|
|
||||||
|
|||||||
@@ -585,8 +585,8 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
cache := algorithm.NewLRUCache[int, int](2)
|
cache := algorithm.NewLRUCache[int, int](2)
|
||||||
|
|
||||||
cache.Put(1, 1)
|
cache.Put(1, 1)
|
||||||
cache.Put(2, 2)
|
cache.Put(2, 2)
|
||||||
|
|
||||||
_, ok := cache.Get(0) // ok -> false
|
_, ok := cache.Get(0) // ok -> false
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
c := concurrency.NewChannel()
|
c := concurrency.NewChannel()
|
||||||
@@ -133,7 +133,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
c := concurrency.NewChannel()
|
c := concurrency.NewChannel()
|
||||||
@@ -173,14 +173,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
c := concurrency.NewChannel()
|
c := concurrency.NewChannel()
|
||||||
intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 5)
|
intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 5)
|
||||||
|
|
||||||
for v := range intStream {
|
for v := range intStream {
|
||||||
fmt.Println(v) //1, 2, 1, 2, 1
|
fmt.Println(v) //1, 2, 1, 2, 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -209,7 +209,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
fn := func() any {
|
fn := func() any {
|
||||||
@@ -220,7 +220,7 @@ func main() {
|
|||||||
dataStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
|
dataStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
|
||||||
|
|
||||||
for v := range dataStream {
|
for v := range dataStream {
|
||||||
fmt.Println(v) //a, a, a
|
fmt.Println(v) //a, a, a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -248,7 +248,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
sig := func(after time.Duration) <-chan any {
|
sig := func(after time.Duration) <-chan any {
|
||||||
c := make(chan interface{})
|
c := make(chan interface{})
|
||||||
go func() {
|
go func() {
|
||||||
defer close(c)
|
defer close(c)
|
||||||
@@ -296,7 +296,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
c := concurrency.NewChannel()
|
c := concurrency.NewChannel()
|
||||||
@@ -332,7 +332,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
numbers := make(chan any, 5)
|
numbers := make(chan any, 5)
|
||||||
@@ -347,7 +347,7 @@ func main() {
|
|||||||
intStream := c.Take(ctx, numbers, 3)
|
intStream := c.Take(ctx, numbers, 3)
|
||||||
|
|
||||||
for val := range intStream {
|
for val := range intStream {
|
||||||
fmt.Println(val) //1, 2, 3
|
fmt.Println(val) //1, 2, 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -375,7 +375,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
c := concurrency.NewChannel()
|
c := concurrency.NewChannel()
|
||||||
@@ -383,8 +383,8 @@ func main() {
|
|||||||
|
|
||||||
out1, out2 := c.Tee(ctx, inStream)
|
out1, out2 := c.Tee(ctx, inStream)
|
||||||
for val := range out1 {
|
for val := range out1 {
|
||||||
fmt.Println(val) //1
|
fmt.Println(val) //1
|
||||||
fmt.Println(<-out2) //1
|
fmt.Println(<-out2) //1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -180,7 +180,7 @@ func main() {
|
|||||||
intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 5)
|
intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 5)
|
||||||
|
|
||||||
for v := range intStream {
|
for v := range intStream {
|
||||||
fmt.Println(v) //1, 2, 1, 2, 1
|
fmt.Println(v) //1, 2, 1, 2, 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -220,7 +220,7 @@ func main() {
|
|||||||
dataStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
|
dataStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
|
||||||
|
|
||||||
for v := range dataStream {
|
for v := range dataStream {
|
||||||
fmt.Println(v) //a, a, a
|
fmt.Println(v) //a, a, a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -248,7 +248,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
sig := func(after time.Duration) <-chan any {
|
sig := func(after time.Duration) <-chan any {
|
||||||
c := make(chan interface{})
|
c := make(chan interface{})
|
||||||
go func() {
|
go func() {
|
||||||
defer close(c)
|
defer close(c)
|
||||||
@@ -296,7 +296,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
c := concurrency.NewChannel()
|
c := concurrency.NewChannel()
|
||||||
@@ -332,7 +332,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
numbers := make(chan any, 5)
|
numbers := make(chan any, 5)
|
||||||
@@ -347,7 +347,7 @@ func main() {
|
|||||||
intStream := c.Take(ctx, numbers, 3)
|
intStream := c.Take(ctx, numbers, 3)
|
||||||
|
|
||||||
for val := range intStream {
|
for val := range intStream {
|
||||||
fmt.Println(val) //1, 2, 3
|
fmt.Println(val) //1, 2, 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -375,7 +375,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
c := concurrency.NewChannel()
|
c := concurrency.NewChannel()
|
||||||
@@ -383,8 +383,8 @@ func main() {
|
|||||||
|
|
||||||
out1, out2 := c.Tee(ctx, inStream)
|
out1, out2 := c.Tee(ctx, inStream)
|
||||||
for val := range out1 {
|
for val := range out1 {
|
||||||
fmt.Println(val) //1
|
fmt.Println(val) //1
|
||||||
fmt.Println(<-out2) //1
|
fmt.Println(<-out2) //1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -24,13 +24,16 @@ import (
|
|||||||
- [ToBool](#ToBool)
|
- [ToBool](#ToBool)
|
||||||
- [ToBytes](#ToBytes)
|
- [ToBytes](#ToBytes)
|
||||||
- [ToChar](#ToChar)
|
- [ToChar](#ToChar)
|
||||||
|
- [ToChannel](#ToChannel)
|
||||||
|
|
||||||
- [ToFloat](#ToFloat)
|
- [ToFloat](#ToFloat)
|
||||||
- [ToInt](#ToInt)
|
- [ToInt](#ToInt)
|
||||||
- [ToJson](#ToJson)
|
- [ToJson](#ToJson)
|
||||||
|
- [ToMap](#ToMap)
|
||||||
- [ToPointer](#ToPointer)
|
- [ToPointer](#ToPointer)
|
||||||
- [ToString](#ToString)
|
- [ToString](#ToString)
|
||||||
- [StructToMap](#StructToMap)
|
- [StructToMap](#StructToMap)
|
||||||
|
- [MapToSlice](#MapToSlice)
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -194,6 +197,43 @@ func main() {
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="ToChannel">ToChannel</span>
|
||||||
|
|
||||||
|
<p>Convert a collection of elements to a read-only channels.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToChannel[T any](array []T) <-chan T
|
||||||
|
```
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ch := convertor.ToChannel([]int{1, 2, 3})
|
||||||
|
|
||||||
|
val1, _ := <-ch
|
||||||
|
fmt.Println(val1) //1
|
||||||
|
|
||||||
|
val2, _ := <-ch
|
||||||
|
fmt.Println(val2) //2
|
||||||
|
|
||||||
|
val3, _ := <-ch
|
||||||
|
fmt.Println(val3) //3
|
||||||
|
|
||||||
|
_, ok := <-ch
|
||||||
|
fmt.Println(ok) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="ToFloat">ToFloat</span>
|
### <span id="ToFloat">ToFloat</span>
|
||||||
|
|
||||||
@@ -289,14 +329,14 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="ToJson">ToJson</span>
|
### <span id="ToMap">ToMap</span>
|
||||||
|
|
||||||
<p>Convert interface to json string. If param can't be converted, will return "" and error. </p>
|
<p>Convert a slice or an array of structs to a map based on iteratee function. </p>
|
||||||
|
|
||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ToJson(value any) (string, error)
|
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -309,9 +349,19 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var aMap = map[string]int{"a": 1, "b": 2, "c": 3}
|
type Message struct {
|
||||||
jsonStr, _ := convertor.ToJson(aMap)
|
name string
|
||||||
fmt.Printf("%q", jsonStr) //"{\"a\":1,\"b\":2,\"c\":3}"
|
code int
|
||||||
|
}
|
||||||
|
messages := []Message{
|
||||||
|
{name: "Hello", code: 100},
|
||||||
|
{name: "Hi", code: 101},
|
||||||
|
}
|
||||||
|
result := convertor.ToMap(messages, func(msg Message) (int, string) {
|
||||||
|
return msg.code, msg.name
|
||||||
|
})
|
||||||
|
|
||||||
|
fmt.Println(result) //{100: "Hello", 101: "Hi"}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -377,3 +427,34 @@ func main() {
|
|||||||
fmt.Printf("type: %T, value: %s", pm, pm) //type: map[string]interface {}, value: map[name:test]
|
fmt.Printf("type: %T, value: %s", pm, pm) //type: map[string]interface {}, value: map[name:test]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="MapToSlice">MapToSlice</span>
|
||||||
|
|
||||||
|
<p>Convert a map to a slice based on iteratee function.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T
|
||||||
|
```
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
aMap := map[string]int{"a": 1, "b": 2, "c": 3}
|
||||||
|
result := MapToSlice(aMap, func(key string, value int) string {
|
||||||
|
return key + ":" + strconv.Itoa(value)
|
||||||
|
})
|
||||||
|
|
||||||
|
fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -26,13 +26,16 @@ import (
|
|||||||
- [ToBool](#ToBool)
|
- [ToBool](#ToBool)
|
||||||
- [ToBytes](#ToBytes)
|
- [ToBytes](#ToBytes)
|
||||||
- [ToChar](#ToChar)
|
- [ToChar](#ToChar)
|
||||||
|
- [ToChannel](#ToChannel)
|
||||||
|
|
||||||
- [ToFloat](#ToFloat)
|
- [ToFloat](#ToFloat)
|
||||||
- [ToInt](#ToInt)
|
- [ToInt](#ToInt)
|
||||||
- [ToJson](#ToJson)
|
- [ToJson](#ToJson)
|
||||||
|
- [ToMap](#ToMap)
|
||||||
- [ToPointer](#ToPointer)
|
- [ToPointer](#ToPointer)
|
||||||
- [ToString](#ToString)
|
- [ToString](#ToString)
|
||||||
- [StructToMap](#StructToMap)
|
- [StructToMap](#StructToMap)
|
||||||
|
- [MapToSlice](#MapToSlice)
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -197,6 +200,44 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="ToChannel">ToChannel</span>
|
||||||
|
|
||||||
|
<p>将切片转为只读channel</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToChannel[T any](array []T) <-chan T
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ch := convertor.ToChannel([]int{1, 2, 3})
|
||||||
|
|
||||||
|
val1, _ := <-ch
|
||||||
|
fmt.Println(val1) //1
|
||||||
|
|
||||||
|
val2, _ := <-ch
|
||||||
|
fmt.Println(val2) //2
|
||||||
|
|
||||||
|
val3, _ := <-ch
|
||||||
|
fmt.Println(val3) //3
|
||||||
|
|
||||||
|
_, ok := <-ch
|
||||||
|
fmt.Println(ok) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="ToFloat">ToFloat</span>
|
### <span id="ToFloat">ToFloat</span>
|
||||||
|
|
||||||
<p>将interface转成float64类型,如果参数无法转换,会返回0和error</p>
|
<p>将interface转成float64类型,如果参数无法转换,会返回0和error</p>
|
||||||
@@ -232,7 +273,7 @@ func main() {
|
|||||||
|
|
||||||
### <span id="ToInt">ToInt</span>
|
### <span id="ToInt">ToInt</span>
|
||||||
|
|
||||||
<p>将interface转成intt64类型,如果参数无法转换,会返回0和error</p>
|
<p>将interface转成int64类型,如果参数无法转换,会返回0和error</p>
|
||||||
|
|
||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
@@ -291,6 +332,44 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="ToMap">ToMap</span>
|
||||||
|
|
||||||
|
<p>将切片转为map</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type Message struct {
|
||||||
|
name string
|
||||||
|
code int
|
||||||
|
}
|
||||||
|
messages := []Message{
|
||||||
|
{name: "Hello", code: 100},
|
||||||
|
{name: "Hi", code: 101},
|
||||||
|
}
|
||||||
|
result := convertor.ToMap(messages, func(msg Message) (int, string) {
|
||||||
|
return msg.code, msg.name
|
||||||
|
})
|
||||||
|
|
||||||
|
fmt.Println(result) //{100: "Hello", 101: "Hi"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="ToPointer">ToPointer</span>
|
### <span id="ToPointer">ToPointer</span>
|
||||||
|
|
||||||
<p>返回传入值的指针</p>
|
<p>返回传入值的指针</p>
|
||||||
@@ -379,3 +458,34 @@ func main() {
|
|||||||
fmt.Printf("type: %T, value: %s", pm, pm) //type: map[string]interface {}, value: map[name:test]
|
fmt.Printf("type: %T, value: %s", pm, pm) //type: map[string]interface {}, value: map[name:test]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="MapToSlice">MapToSlice</span>
|
||||||
|
|
||||||
|
<p>map中key和value执行函数iteratee后,转为切片</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
aMap := map[string]int{"a": 1, "b": 2, "c": 3}
|
||||||
|
result := MapToSlice(aMap, func(key string, value int) string {
|
||||||
|
return key + ":" + strconv.Itoa(value)
|
||||||
|
})
|
||||||
|
|
||||||
|
fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
@@ -115,9 +115,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -145,7 +145,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
@@ -176,9 +176,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -207,7 +207,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
@@ -239,7 +239,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
}
|
}
|
||||||
@@ -271,7 +271,7 @@ func main() {
|
|||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -300,7 +300,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
}
|
}
|
||||||
@@ -330,9 +330,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesOfbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesOfbDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
@@ -360,7 +360,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
base64Str := cryptor.Base64StdEncode("hello world")
|
base64Str := cryptor.Base64StdEncode("hello world")
|
||||||
fmt.Println(base64Str) //aGVsbG8gd29ybGQ=
|
fmt.Println(base64Str) //aGVsbG8gd29ybGQ=
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -417,7 +417,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
@@ -448,9 +448,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byt(key)
|
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byt(key)
|
||||||
decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
@@ -480,7 +480,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byt(key)
|
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byt(key)
|
||||||
|
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
@@ -511,7 +511,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byt(key)
|
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byt(key)
|
||||||
decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
@@ -543,7 +543,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
@@ -575,7 +575,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byt(key)
|
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byt(key)
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
}
|
}
|
||||||
@@ -605,9 +605,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byt(key)
|
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byt(key)
|
||||||
decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -636,7 +636,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
}
|
}
|
||||||
@@ -666,9 +666,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
@@ -725,8 +725,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.HmacSha1("hello world", "12345"))
|
s := cryptor.HmacSha1("hello world", "12345"))
|
||||||
fmt.Println(s) //3826f812255d8683f051ee97346d1359234d5dbd
|
fmt.Println(s) //3826f812255d8683f051ee97346d1359234d5dbd
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -753,8 +753,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.HmacSha256("hello world", "12345"))
|
s := cryptor.HmacSha256("hello world", "12345"))
|
||||||
fmt.Println(s) //9dce2609f2d67d41f74c7f9efc8ccd44370d41ad2de52982627588dfe7289ab8
|
fmt.Println(s) //9dce2609f2d67d41f74c7f9efc8ccd44370d41ad2de52982627588dfe7289ab8
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -781,8 +781,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.HmacSha512("hello world", "12345"))
|
s := cryptor.HmacSha512("hello world", "12345"))
|
||||||
fmt.Println(s)
|
fmt.Println(s)
|
||||||
//5b1563ac4e9b49c9ada8ccb232588fc4f0c30fd12f756b3a0b95af4985c236ca60925253bae10ce2c6bf9af1c1679b51e5395ff3d2826c0a2c7c0d72225d4175
|
//5b1563ac4e9b49c9ada8ccb232588fc4f0c30fd12f756b3a0b95af4985c236ca60925253bae10ce2c6bf9af1c1679b51e5395ff3d2826c0a2c7c0d72225d4175
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -810,8 +810,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Md5String("hello"))
|
s := cryptor.Md5String("hello"))
|
||||||
fmt.Println(s) //5d41402abc4b2a76b9719d911017c592
|
fmt.Println(s) //5d41402abc4b2a76b9719d911017c592
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -838,8 +838,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Md5File("./main.go"))
|
s := cryptor.Md5File("./main.go"))
|
||||||
fmt.Println(s)
|
fmt.Println(s)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -866,8 +866,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Sha1("hello world"))
|
s := cryptor.Sha1("hello world"))
|
||||||
fmt.Println(s) //2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
|
fmt.Println(s) //2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -894,8 +894,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Sha256("hello world"))
|
s := cryptor.Sha256("hello world"))
|
||||||
fmt.Println(s) //b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
|
fmt.Println(s) //b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -922,7 +922,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Sha512("hello world"))
|
s := cryptor.Sha512("hello world"))
|
||||||
fmt.Println(s) //309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f
|
fmt.Println(s) //309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -950,10 +950,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -980,14 +980,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
data := []byte("hello world")
|
data := []byte("hello world")
|
||||||
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
||||||
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
|
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
@@ -1016,14 +1016,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
data := []byte("hello world")
|
data := []byte("hello world")
|
||||||
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
||||||
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
|
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
@@ -115,9 +115,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -145,7 +145,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
@@ -176,9 +176,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
@@ -208,7 +208,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
@@ -240,7 +240,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
}
|
}
|
||||||
@@ -270,9 +270,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -301,7 +301,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
}
|
}
|
||||||
@@ -331,9 +331,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefghijklmnop"
|
key := "abcdefghijklmnop"
|
||||||
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.AesOfbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.AesOfbDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -360,7 +360,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
base64Str := cryptor.Base64StdEncode("hello world")
|
base64Str := cryptor.Base64StdEncode("hello world")
|
||||||
fmt.Println(base64Str) //aGVsbG8gd29ybGQ=
|
fmt.Println(base64Str) //aGVsbG8gd29ybGQ=
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -388,7 +388,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
str := cryptor.Base64StdDecode("aGVsbG8gd29ybGQ=")
|
str := cryptor.Base64StdDecode("aGVsbG8gd29ybGQ=")
|
||||||
fmt.Println(str) //hello world
|
fmt.Println(str) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -417,7 +417,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
@@ -448,7 +448,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
@@ -480,7 +480,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
@@ -511,7 +511,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
@@ -543,7 +543,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
@@ -575,7 +575,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
}
|
}
|
||||||
@@ -605,7 +605,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
@@ -636,7 +636,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
||||||
fmt.Println(string(encrypted))
|
fmt.Println(string(encrypted))
|
||||||
}
|
}
|
||||||
@@ -666,7 +666,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data := "hello world"
|
data := "hello world"
|
||||||
key := "abcdefgh"
|
key := "abcdefgh"
|
||||||
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
||||||
decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
|
decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
@@ -696,8 +696,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.HmacMd5("hello world", "12345"))
|
s := cryptor.HmacMd5("hello world", "12345"))
|
||||||
fmt.Println(s) //5f4c9faaff0a1ad3007d9ddc06abe36d
|
fmt.Println(s) //5f4c9faaff0a1ad3007d9ddc06abe36d
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -724,8 +724,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.HmacSha1("hello world", "12345"))
|
s := cryptor.HmacSha1("hello world", "12345"))
|
||||||
fmt.Println(s) //3826f812255d8683f051ee97346d1359234d5dbd
|
fmt.Println(s) //3826f812255d8683f051ee97346d1359234d5dbd
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -752,8 +752,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.HmacSha256("hello world", "12345"))
|
s := cryptor.HmacSha256("hello world", "12345"))
|
||||||
fmt.Println(s) //9dce2609f2d67d41f74c7f9efc8ccd44370d41ad2de52982627588dfe7289ab8
|
fmt.Println(s) //9dce2609f2d67d41f74c7f9efc8ccd44370d41ad2de52982627588dfe7289ab8
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -780,8 +780,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.HmacSha512("hello world", "12345"))
|
s := cryptor.HmacSha512("hello world", "12345"))
|
||||||
fmt.Println(s)
|
fmt.Println(s)
|
||||||
//5b1563ac4e9b49c9ada8ccb232588fc4f0c30fd12f756b3a0b95af4985c236ca60925253bae10ce2c6bf9af1c1679b51e5395ff3d2826c0a2c7c0d72225d4175
|
//5b1563ac4e9b49c9ada8ccb232588fc4f0c30fd12f756b3a0b95af4985c236ca60925253bae10ce2c6bf9af1c1679b51e5395ff3d2826c0a2c7c0d72225d4175
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -809,8 +809,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Md5String("hello"))
|
s := cryptor.Md5String("hello"))
|
||||||
fmt.Println(s) //5d41402abc4b2a76b9719d911017c592
|
fmt.Println(s) //5d41402abc4b2a76b9719d911017c592
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -837,8 +837,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Md5File("./main.go"))
|
s := cryptor.Md5File("./main.go"))
|
||||||
fmt.Println(s)
|
fmt.Println(s)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -865,8 +865,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Sha1("hello world"))
|
s := cryptor.Sha1("hello world"))
|
||||||
fmt.Println(s) //2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
|
fmt.Println(s) //2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -893,8 +893,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Sha256("hello world"))
|
s := cryptor.Sha256("hello world"))
|
||||||
fmt.Println(s) //b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
|
fmt.Println(s) //b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -921,8 +921,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := cryptor.Sha512("hello world"))
|
s := cryptor.Sha512("hello world"))
|
||||||
fmt.Println(s) //309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f
|
fmt.Println(s) //309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -949,10 +949,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -979,11 +979,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
data := []byte("hello world")
|
data := []byte("hello world")
|
||||||
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
||||||
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
@@ -1013,11 +1013,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
data := []byte("hello world")
|
data := []byte("hello world")
|
||||||
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
||||||
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
fmt.Println(string(decrypted)) //hello world
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
|||||||
@@ -712,7 +712,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
type theTime struct {
|
type theTime struct {
|
||||||
unix int64
|
unix int64
|
||||||
}
|
}
|
||||||
func NewUnix(unix int64) *theTime
|
func NewUnix(unix int64) *theTime
|
||||||
```
|
```
|
||||||
@@ -741,7 +741,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
type theTime struct {
|
type theTime struct {
|
||||||
unix int64
|
unix int64
|
||||||
}
|
}
|
||||||
func NewFormat(t string) (*theTime, error)
|
func NewFormat(t string) (*theTime, error)
|
||||||
```
|
```
|
||||||
@@ -771,7 +771,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
type theTime struct {
|
type theTime struct {
|
||||||
unix int64
|
unix int64
|
||||||
}
|
}
|
||||||
func NewISO8601(iso8601 string) (*theTime, error)
|
func NewISO8601(iso8601 string) (*theTime, error)
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -680,7 +680,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
type theTime struct {
|
type theTime struct {
|
||||||
unix int64
|
unix int64
|
||||||
}
|
}
|
||||||
func NewUnixNow() *theTime
|
func NewUnixNow() *theTime
|
||||||
```
|
```
|
||||||
@@ -708,7 +708,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
type theTime struct {
|
type theTime struct {
|
||||||
unix int64
|
unix int64
|
||||||
}
|
}
|
||||||
func NewUnix(unix int64) *theTime
|
func NewUnix(unix int64) *theTime
|
||||||
```
|
```
|
||||||
@@ -737,7 +737,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
type theTime struct {
|
type theTime struct {
|
||||||
unix int64
|
unix int64
|
||||||
}
|
}
|
||||||
func NewFormat(t string) (*theTime, error)
|
func NewFormat(t string) (*theTime, error)
|
||||||
```
|
```
|
||||||
@@ -767,7 +767,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
type theTime struct {
|
type theTime struct {
|
||||||
unix int64
|
unix int64
|
||||||
}
|
}
|
||||||
func NewISO8601(iso8601 string) (*theTime, error)
|
func NewISO8601(iso8601 string) (*theTime, error)
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -140,9 +140,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
|
err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -168,9 +168,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
mode, err := fileutil.FileMode("./test.txt")
|
mode, err := fileutil.FileMode("./test.txt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
fmt.Println(mode)
|
fmt.Println(mode)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -338,8 +338,8 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
err := fileutil.RemoveFile("./test.txt")
|
err := fileutil.RemoveFile("./test.txt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -365,12 +365,12 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
path := "./test.txt"
|
path := "./test.txt"
|
||||||
fileutil.CreateFile(path)
|
fileutil.CreateFile(path)
|
||||||
|
|
||||||
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
f.WriteString("hello world")
|
f.WriteString("hello world")
|
||||||
|
|
||||||
content, _ := fileutil.ReadFileToString(path)
|
content, _ := fileutil.ReadFileToString(path)
|
||||||
fmt.Println(content) //hello world
|
fmt.Println(content) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -398,13 +398,13 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
path := "./text.txt"
|
path := "./text.txt"
|
||||||
fileutil.CreateFile(path)
|
fileutil.CreateFile(path)
|
||||||
|
|
||||||
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
f.WriteString("hello\nworld")
|
f.WriteString("hello\nworld")
|
||||||
|
|
||||||
contents, _ := fileutil.ReadFileByLine(path)
|
contents, _ := fileutil.ReadFileByLine(path)
|
||||||
fmt.Println(contents) //[]string{"hello", "world"}
|
fmt.Println(contents) //[]string{"hello", "world"}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -430,7 +430,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := fileutil.Zip("./test.txt", "./test.zip")
|
err := fileutil.Zip("./test.txt", "./test.zip")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
@@ -459,7 +459,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := fileutil.Zip("./test.zip", "./unzip/test.txt")
|
err := fileutil.Zip("./test.zip", "./unzip/test.txt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,9 +139,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
|
err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -167,9 +167,9 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
mode, err := fileutil.FileMode("./test.txt")
|
mode, err := fileutil.FileMode("./test.txt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
fmt.Println(mode)
|
fmt.Println(mode)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -337,8 +337,8 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
err := fileutil.RemoveFile("./test.txt")
|
err := fileutil.RemoveFile("./test.txt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -364,12 +364,12 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
path := "./test.txt"
|
path := "./test.txt"
|
||||||
fileutil.CreateFile(path)
|
fileutil.CreateFile(path)
|
||||||
|
|
||||||
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
f.WriteString("hello world")
|
f.WriteString("hello world")
|
||||||
|
|
||||||
content, _ := fileutil.ReadFileToString(path)
|
content, _ := fileutil.ReadFileToString(path)
|
||||||
fmt.Println(content) //hello world
|
fmt.Println(content) //hello world
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -397,13 +397,13 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
path := "./text.txt"
|
path := "./text.txt"
|
||||||
fileutil.CreateFile(path)
|
fileutil.CreateFile(path)
|
||||||
|
|
||||||
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
f.WriteString("hello\nworld")
|
f.WriteString("hello\nworld")
|
||||||
|
|
||||||
contents, _ := fileutil.ReadFileByLine(path)
|
contents, _ := fileutil.ReadFileByLine(path)
|
||||||
fmt.Println(contents) //[]string{"hello", "world"}
|
fmt.Println(contents) //[]string{"hello", "world"}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -429,7 +429,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := fileutil.Zip("./test.txt", "./test.zip")
|
err := fileutil.Zip("./test.txt", "./test.zip")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
@@ -458,7 +458,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := fileutil.Zip("./test.zip", "./unzip/test.txt")
|
err := fileutil.Zip("./test.zip", "./unzip/test.txt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,8 +101,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
assert := internal.NewAssert(t, "TestBefore")
|
|
||||||
|
|
||||||
arr := []string{"a", "b", "c", "d", "e"}
|
arr := []string{"a", "b", "c", "d", "e"}
|
||||||
f := function.Before(3, func(i int) int {
|
f := function.Before(3, func(i int) int {
|
||||||
return i
|
return i
|
||||||
@@ -120,7 +118,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
expected := []int64{0, 1, 2, 2, 2}
|
expected := []int64{0, 1, 2, 2, 2}
|
||||||
assert.Equal(expected, res)
|
fmt.Println(res) // 0, 1, 2, 2, 2
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -101,8 +101,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
assert := internal.NewAssert(t, "TestBefore")
|
|
||||||
|
|
||||||
arr := []string{"a", "b", "c", "d", "e"}
|
arr := []string{"a", "b", "c", "d", "e"}
|
||||||
f := function.Before(3, func(i int) int {
|
f := function.Before(3, func(i int) int {
|
||||||
return i
|
return i
|
||||||
@@ -119,8 +117,7 @@ func main() {
|
|||||||
appendStr(i, arr[i], f)
|
appendStr(i, arr[i], f)
|
||||||
}
|
}
|
||||||
|
|
||||||
expected := []int64{0, 1, 2, 2, 2}
|
fmt.Println(res) // 0, 1, 2, 2, 2
|
||||||
assert.Equal(expected, res)
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -297,7 +294,7 @@ func main() {
|
|||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
close(stop)
|
close(stop)
|
||||||
|
|
||||||
fmt.Println(res) //[* * * * *]
|
fmt.Println(res) //[* * * * *]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Package maputil includes some functions to manipulate map.
|
|||||||
|
|
||||||
## Source:
|
## Source:
|
||||||
|
|
||||||
- [https://github.com/duke-git/lancet/blob/main/maputil/maputil.go](https://github.com/duke-git/lancet/blob/main/maputil/maputil.go)
|
- [https://github.com/duke-git/lancet/blob/main/maputil/map.go](https://github.com/duke-git/lancet/blob/main/maputil/map.go)
|
||||||
|
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
@@ -27,6 +27,7 @@ import (
|
|||||||
- [Merge](#Merge)
|
- [Merge](#Merge)
|
||||||
- [Minus](#Minus)
|
- [Minus](#Minus)
|
||||||
- [Values](#Values)
|
- [Values](#Values)
|
||||||
|
- [Values](#Values)
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -302,3 +303,50 @@ func main() {
|
|||||||
fmt.Println(values) // []string{"a", "a", "b", "c", "d"}
|
fmt.Println(values) // []string{"a", "a", "b", "c", "d"}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### <span id="IsDisjoint">IsDisjoint</span>
|
||||||
|
<p>Checks two are disjoint if they have no keys in common</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool
|
||||||
|
```
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/maputil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m1 := map[int]string{
|
||||||
|
1: "a",
|
||||||
|
2: "a",
|
||||||
|
3: "b",
|
||||||
|
4: "c",
|
||||||
|
5: "d",
|
||||||
|
}
|
||||||
|
|
||||||
|
m2 := map[int]string{
|
||||||
|
1: "a",
|
||||||
|
2: "a",
|
||||||
|
3: "b",
|
||||||
|
4: "c",
|
||||||
|
5: "d",
|
||||||
|
}
|
||||||
|
|
||||||
|
m3 := map[int]string{
|
||||||
|
6: "a",
|
||||||
|
}
|
||||||
|
|
||||||
|
ok := maputil.IsDisjoint(m2, m1)
|
||||||
|
fmt.Println(ok) // false
|
||||||
|
|
||||||
|
ok = maputil.IsDisjoint(m2, m3)
|
||||||
|
fmt.Println(ok) // true
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -5,7 +5,7 @@ maputil包包括一些操作map的函数。
|
|||||||
|
|
||||||
## 源码:
|
## 源码:
|
||||||
|
|
||||||
- [https://github.com/duke-git/lancet/blob/main/maputil/maputil.go](https://github.com/duke-git/lancet/blob/main/maputil/maputil.go)
|
- [https://github.com/duke-git/lancet/blob/main/maputil/map.go](https://github.com/duke-git/lancet/blob/main/maputil/map.go)
|
||||||
|
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
@@ -27,6 +27,7 @@ import (
|
|||||||
- [Merge](#Merge)
|
- [Merge](#Merge)
|
||||||
- [Minus](#Minus)
|
- [Minus](#Minus)
|
||||||
- [Values](#Values)
|
- [Values](#Values)
|
||||||
|
- [IsDisjoint](#IsDisjoint)
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -231,7 +232,6 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="Minus">Minus</span>
|
### <span id="Minus">Minus</span>
|
||||||
<p>返回一个map,其中的key存在于mapA,不存在于mapB.</p>
|
<p>返回一个map,其中的key存在于mapA,不存在于mapB.</p>
|
||||||
|
|
||||||
@@ -302,3 +302,51 @@ func main() {
|
|||||||
fmt.Println(values) // []string{"a", "a", "b", "c", "d"}
|
fmt.Println(values) // []string{"a", "a", "b", "c", "d"}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="IsDisjoint">IsDisjoint</span>
|
||||||
|
<p>验证两个map是否具有不同的key</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/maputil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m1 := map[int]string{
|
||||||
|
1: "a",
|
||||||
|
2: "a",
|
||||||
|
3: "b",
|
||||||
|
4: "c",
|
||||||
|
5: "d",
|
||||||
|
}
|
||||||
|
|
||||||
|
m2 := map[int]string{
|
||||||
|
1: "a",
|
||||||
|
2: "a",
|
||||||
|
3: "b",
|
||||||
|
4: "c",
|
||||||
|
5: "d",
|
||||||
|
}
|
||||||
|
|
||||||
|
m3 := map[int]string{
|
||||||
|
6: "a",
|
||||||
|
}
|
||||||
|
|
||||||
|
ok := maputil.IsDisjoint(m2, m1)
|
||||||
|
fmt.Println(ok) // false
|
||||||
|
|
||||||
|
ok = maputil.IsDisjoint(m2, m3)
|
||||||
|
fmt.Println(ok) // true
|
||||||
|
}
|
||||||
|
```
|
||||||
120
docs/netutil.md
120
docs/netutil.md
@@ -22,16 +22,19 @@ import (
|
|||||||
|
|
||||||
## Index
|
## Index
|
||||||
- [ConvertMapToQueryString](#ConvertMapToQueryString)
|
- [ConvertMapToQueryString](#ConvertMapToQueryString)
|
||||||
|
- [EncodeUrl](#EncodeUrl)
|
||||||
|
|
||||||
- [GetInternalIp](#GetInternalIp)
|
- [GetInternalIp](#GetInternalIp)
|
||||||
- [GetIps](#GetIps)
|
- [GetIps](#GetIps)
|
||||||
- [GetMacAddrs](#GetMacAddrs)
|
- [GetMacAddrs](#GetMacAddrs)
|
||||||
- [GetPublicIpInfo](#GetPublicIpInfo)
|
- [GetPublicIpInfo](#GetPublicIpInfo)
|
||||||
|
- [GetRequestPublicIp](#GetRequestPublicIp)
|
||||||
- [IsPublicIP](#IsPublicIP)
|
- [IsPublicIP](#IsPublicIP)
|
||||||
|
- [IsInternalIP](#IsInternalIP)
|
||||||
- [HttpGet](#HttpGet)
|
- [HttpGet](#HttpGet)
|
||||||
- [HttpDelete](#HttpDelete)
|
- [HttpDelete](#HttpDelete)
|
||||||
- [HttpPost](#HttpPost)
|
- [HttpPost](#HttpPost)
|
||||||
- [HttpPut](#HttpPut)
|
- [HttpPut](#HttpPut)
|
||||||
|
|
||||||
- [HttpPatch](#HttpPatch)
|
- [HttpPatch](#HttpPatch)
|
||||||
- [ParseHttpResponse](#ParseHttpResponse)
|
- [ParseHttpResponse](#ParseHttpResponse)
|
||||||
|
|
||||||
@@ -72,6 +75,36 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="EncodeUrl">EncodeUrl</span>
|
||||||
|
<p>Encode url query string values.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EncodeUrl(urlStr string) (string, error)
|
||||||
|
```
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
urlAddr := "http://www.lancet.com?a=1&b=[2]"
|
||||||
|
encodedUrl, err := netutil.EncodeUrl(urlAddr)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
fmt.Println(encodedUrl) //http://www.lancet.com?a=1&b=%5B2%5D
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="GetInternalIp">GetInternalIp</span>
|
### <span id="GetInternalIp">GetInternalIp</span>
|
||||||
<p>Get internal ip information.</p>
|
<p>Get internal ip information.</p>
|
||||||
|
|
||||||
@@ -199,8 +232,51 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="GetRequestPublicIp">GetRequestPublicIp</span>
|
||||||
|
<p>Get http request public ip.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetRequestPublicIp(req *http.Request) string
|
||||||
|
```
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ip := "36.112.24.10"
|
||||||
|
|
||||||
|
request1 := http.Request{
|
||||||
|
Method: "GET",
|
||||||
|
Header: http.Header{
|
||||||
|
"X-Forwarded-For": {ip},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
publicIp1 := netutil.GetRequestPublicIp(&request1)
|
||||||
|
fmt.Println(publicIp1) //36.112.24.10
|
||||||
|
|
||||||
|
request2 := http.Request{
|
||||||
|
Method: "GET",
|
||||||
|
Header: http.Header{
|
||||||
|
"X-Real-Ip": {ip},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
publicIp2 := netutil.GetRequestPublicIp(&request2)
|
||||||
|
fmt.Println(publicIp2) //36.112.24.10
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="IsPublicIP">IsPublicIP</span>
|
### <span id="IsPublicIP">IsPublicIP</span>
|
||||||
<p>Checks if a ip is public or not.</p>
|
<p>Checks if an ip is public or not.</p>
|
||||||
|
|
||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
@@ -230,6 +306,36 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="IsInternalIP">IsInternalIP</span>
|
||||||
|
<p>Checks if an ip is intranet or not.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsInternalIP(IP net.IP) bool
|
||||||
|
```
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/v2/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ip1 := net.ParseIP("127.0.0.1")
|
||||||
|
ip2 := net.ParseIP("36.112.24.10")
|
||||||
|
|
||||||
|
fmt.Println(netutil.IsInternalIP(ip1)) //true
|
||||||
|
fmt.Println(netutil.IsInternalIP(ip2)) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="HttpGet">HttpGet</span>
|
### <span id="HttpGet">HttpGet</span>
|
||||||
<p>Send http get request.</p>
|
<p>Send http get request.</p>
|
||||||
|
|
||||||
@@ -237,7 +343,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] is header which type should be http.Header or map[string]string,
|
// params[0] is header which type should be http.Header or map[string]string,
|
||||||
// params[1] is query param which type should be url.Values or map[string]any,
|
// params[1] is query param which type should be url.Values or map[string]string,
|
||||||
// params[2] is post body which type should be []byte.
|
// params[2] is post body which type should be []byte.
|
||||||
// params[3] is http client which type should be http.Client.
|
// params[3] is http client which type should be http.Client.
|
||||||
func HttpGet(url string, params ...any) (*http.Response, error)
|
func HttpGet(url string, params ...any) (*http.Response, error)
|
||||||
@@ -279,7 +385,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] is header which type should be http.Header or map[string]string,
|
// params[0] is header which type should be http.Header or map[string]string,
|
||||||
// params[1] is query param which type should be url.Values or map[string]any,
|
// params[1] is query param which type should be url.Values or map[string]string,
|
||||||
// params[2] is post body which type should be []byte.
|
// params[2] is post body which type should be []byte.
|
||||||
// params[3] is http client which type should be http.Client.
|
// params[3] is http client which type should be http.Client.
|
||||||
func HttpPost(url string, params ...any) (*http.Response, error)
|
func HttpPost(url string, params ...any) (*http.Response, error)
|
||||||
@@ -328,7 +434,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] is header which type should be http.Header or map[string]string,
|
// params[0] is header which type should be http.Header or map[string]string,
|
||||||
// params[1] is query param which type should be url.Values or map[string]any,
|
// params[1] is query param which type should be url.Values or map[string]string,
|
||||||
// params[2] is post body which type should be []byte.
|
// params[2] is post body which type should be []byte.
|
||||||
// params[3] is http client which type should be http.Client.
|
// params[3] is http client which type should be http.Client.
|
||||||
func HttpPut(url string, params ...any) (*http.Response, error)
|
func HttpPut(url string, params ...any) (*http.Response, error)
|
||||||
@@ -378,7 +484,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] is header which type should be http.Header or map[string]string,
|
// params[0] is header which type should be http.Header or map[string]string,
|
||||||
// params[1] is query param which type should be url.Values or map[string]any,
|
// params[1] is query param which type should be url.Values or map[string]string,
|
||||||
// params[2] is post body which type should be []byte.
|
// params[2] is post body which type should be []byte.
|
||||||
// params[3] is http client which type should be http.Client.
|
// params[3] is http client which type should be http.Client.
|
||||||
func HttpDelete(url string, params ...any) (*http.Response, error)
|
func HttpDelete(url string, params ...any) (*http.Response, error)
|
||||||
@@ -417,7 +523,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] is header which type should be http.Header or map[string]string,
|
// params[0] is header which type should be http.Header or map[string]string,
|
||||||
// params[1] is query param which type should be url.Values or map[string]any,
|
// params[1] is query param which type should be url.Values or map[string]string,
|
||||||
// params[2] is post body which type should be []byte.
|
// params[2] is post body which type should be []byte.
|
||||||
// params[3] is http client which type should be http.Client.
|
// params[3] is http client which type should be http.Client.
|
||||||
func HttpPatch(url string, params ...any) (*http.Response, error)
|
func HttpPatch(url string, params ...any) (*http.Response, error)
|
||||||
|
|||||||
@@ -21,16 +21,19 @@ import (
|
|||||||
|
|
||||||
## 目录
|
## 目录
|
||||||
- [ConvertMapToQueryString](#ConvertMapToQueryString)
|
- [ConvertMapToQueryString](#ConvertMapToQueryString)
|
||||||
|
- [EncodeUrl](#EncodeUrl)
|
||||||
- [GetInternalIp](#GetInternalIp)
|
- [GetInternalIp](#GetInternalIp)
|
||||||
- [GetIps](#GetIps)
|
- [GetIps](#GetIps)
|
||||||
- [GetMacAddrs](#GetMacAddrs)
|
- [GetMacAddrs](#GetMacAddrs)
|
||||||
- [GetPublicIpInfo](#GetPublicIpInfo)
|
- [GetPublicIpInfo](#GetPublicIpInfo)
|
||||||
|
- [GetRequestPublicIp](#GetRequestPublicIp)
|
||||||
|
|
||||||
- [IsPublicIP](#IsPublicIP)
|
- [IsPublicIP](#IsPublicIP)
|
||||||
|
- [IsInternalIP](#IsInternalIP)
|
||||||
- [HttpGet](#HttpGet)
|
- [HttpGet](#HttpGet)
|
||||||
- [HttpDelete](#HttpDelete)
|
- [HttpDelete](#HttpDelete)
|
||||||
- [HttpPost](#HttpPost)
|
- [HttpPost](#HttpPost)
|
||||||
- [HttpPut](#HttpPut)
|
- [HttpPut](#HttpPut)
|
||||||
|
|
||||||
- [HttpPatch](#HttpPatch)
|
- [HttpPatch](#HttpPatch)
|
||||||
- [ParseHttpResponse](#ParseHttpResponse)
|
- [ParseHttpResponse](#ParseHttpResponse)
|
||||||
|
|
||||||
@@ -71,6 +74,37 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="EncodeUrl">EncodeUrl</span>
|
||||||
|
<p>编码url query string的值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EncodeUrl(urlStr string) (string, error)
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
urlAddr := "http://www.lancet.com?a=1&b=[2]"
|
||||||
|
encodedUrl, err := netutil.EncodeUrl(urlAddr)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
fmt.Println(encodedUrl) //http://www.lancet.com?a=1&b=%5B2%5D
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="GetInternalIp">GetInternalIp</span>
|
### <span id="GetInternalIp">GetInternalIp</span>
|
||||||
<p>获取内部ip</p>
|
<p>获取内部ip</p>
|
||||||
|
|
||||||
@@ -197,6 +231,50 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="GetRequestPublicIp">GetRequestPublicIp</span>
|
||||||
|
<p>获取http请求ip</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetRequestPublicIp(req *http.Request) string
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ip := "36.112.24.10"
|
||||||
|
|
||||||
|
request1 := http.Request{
|
||||||
|
Method: "GET",
|
||||||
|
Header: http.Header{
|
||||||
|
"X-Forwarded-For": {ip},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
publicIp1 := netutil.GetRequestPublicIp(&request1)
|
||||||
|
fmt.Println(publicIp1) //36.112.24.10
|
||||||
|
|
||||||
|
request2 := http.Request{
|
||||||
|
Method: "GET",
|
||||||
|
Header: http.Header{
|
||||||
|
"X-Real-Ip": {ip},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
publicIp2 := netutil.GetRequestPublicIp(&request2)
|
||||||
|
fmt.Println(publicIp2) //36.112.24.10
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="IsPublicIP">IsPublicIP</span>
|
### <span id="IsPublicIP">IsPublicIP</span>
|
||||||
<p>判断ip是否是公共ip</p>
|
<p>判断ip是否是公共ip</p>
|
||||||
|
|
||||||
@@ -227,6 +305,35 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="IsInternalIP">IsInternalIP</span>
|
||||||
|
<p>判断ip是否是局域网ip.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsInternalIP(IP net.IP) bool
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/v2/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ip1 := net.ParseIP("127.0.0.1")
|
||||||
|
ip2 := net.ParseIP("36.112.24.10")
|
||||||
|
|
||||||
|
fmt.Println(netutil.IsInternalIP(ip1)) //true
|
||||||
|
fmt.Println(netutil.IsInternalIP(ip2)) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="HttpGet">HttpGet</span>
|
### <span id="HttpGet">HttpGet</span>
|
||||||
<p>发送http get请求</p>
|
<p>发送http get请求</p>
|
||||||
@@ -235,7 +342,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
// params[1] http查询字符串,类型必须是url.Values或者map[string]any
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]string
|
||||||
// params[2] post请求体,类型必须是[]byte
|
// params[2] post请求体,类型必须是[]byte
|
||||||
// params[3] http client,类型必须是http.Client
|
// params[3] http client,类型必须是http.Client
|
||||||
func HttpGet(url string, params ...any) (*http.Response, error)
|
func HttpGet(url string, params ...any) (*http.Response, error)
|
||||||
@@ -277,7 +384,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
// params[1] http查询字符串,类型必须是url.Values或者map[string]any
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]string
|
||||||
// params[2] post请求体,类型必须是[]byte
|
// params[2] post请求体,类型必须是[]byte
|
||||||
// params[3] http client,类型必须是http.Client
|
// params[3] http client,类型必须是http.Client
|
||||||
func HttpPost(url string, params ...any) (*http.Response, error)
|
func HttpPost(url string, params ...any) (*http.Response, error)
|
||||||
@@ -326,7 +433,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
// params[1] http查询字符串,类型必须是url.Values或者map[string]any
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]string
|
||||||
// params[2] post请求体,类型必须是[]byte
|
// params[2] post请求体,类型必须是[]byte
|
||||||
// params[3] http client,类型必须是http.Client
|
// params[3] http client,类型必须是http.Client
|
||||||
func HttpPut(url string, params ...any) (*http.Response, error)
|
func HttpPut(url string, params ...any) (*http.Response, error)
|
||||||
@@ -376,7 +483,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
// params[1] http查询字符串,类型必须是url.Values或者map[string]any
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]string
|
||||||
// params[2] post请求体,类型必须是[]byte
|
// params[2] post请求体,类型必须是[]byte
|
||||||
// params[3] http client,类型必须是http.Client
|
// params[3] http client,类型必须是http.Client
|
||||||
func HttpDelete(url string, params ...any) (*http.Response, error)
|
func HttpDelete(url string, params ...any) (*http.Response, error)
|
||||||
@@ -415,7 +522,7 @@ func main() {
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
// params[1] http查询字符串,类型必须是url.Values或者map[string]any
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]string
|
||||||
// params[2] post请求体,类型必须是[]byte
|
// params[2] post请求体,类型必须是[]byte
|
||||||
// params[3] http client,类型必须是http.Client
|
// params[3] http client,类型必须是http.Client
|
||||||
func HttpPatch(url string, params ...any) (*http.Response, error)
|
func HttpPatch(url string, params ...any) (*http.Response, error)
|
||||||
|
|||||||
@@ -97,8 +97,8 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var number int
|
var number int
|
||||||
var increaseNumber retry.RetryFunc
|
|
||||||
increaseNumber = func() error {
|
increaseNumber := func() error {
|
||||||
number++
|
number++
|
||||||
if number == 3 {
|
if number == 3 {
|
||||||
return nil
|
return nil
|
||||||
@@ -139,6 +139,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var number int
|
var number int
|
||||||
|
|
||||||
increaseNumber := func() error {
|
increaseNumber := func() error {
|
||||||
number++
|
number++
|
||||||
if number == 3 {
|
if number == 3 {
|
||||||
|
|||||||
@@ -99,8 +99,7 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var number int
|
var number int
|
||||||
var increaseNumber retry.RetryFunc
|
increaseNumber := func() error {
|
||||||
increaseNumber = func() error {
|
|
||||||
number++
|
number++
|
||||||
if number == 3 {
|
if number == 3 {
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import (
|
|||||||
- [Filter](#Filter)
|
- [Filter](#Filter)
|
||||||
- [Find](#Find)
|
- [Find](#Find)
|
||||||
- [FindLast](#FindLast)
|
- [FindLast](#FindLast)
|
||||||
|
- [Flatten](#Flatten)
|
||||||
- [FlattenDeep](#FlattenDeep)
|
- [FlattenDeep](#FlattenDeep)
|
||||||
- [ForEach](#ForEach)
|
- [ForEach](#ForEach)
|
||||||
|
|
||||||
@@ -56,6 +57,8 @@ import (
|
|||||||
- [Some](#Some)
|
- [Some](#Some)
|
||||||
- [StringSlice](#StringSlice)
|
- [StringSlice](#StringSlice)
|
||||||
- [SymmetricDifference](#SymmetricDifference)
|
- [SymmetricDifference](#SymmetricDifference)
|
||||||
|
- [ToSlice](#ToSlice)
|
||||||
|
- [ToSlicePointer](#ToSlicePointer)
|
||||||
- [Unique](#Unique)
|
- [Unique](#Unique)
|
||||||
- [UniqueBy](#UniqueBy)
|
- [UniqueBy](#UniqueBy)
|
||||||
- [Union](#Union)
|
- [Union](#Union)
|
||||||
@@ -72,7 +75,7 @@ import (
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Contain[T any](slice []T, value T) bool
|
func Contain[T comparable](slice []T, value T) bool
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -95,7 +98,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ContainSubSlice[T any](slice, subslice []T) bool
|
func ContainSubSlice[T comparable](slice, subslice []T) bool
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -253,7 +256,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func DifferenceBy[T any](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T
|
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -546,6 +549,31 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="Flatten">Flatten</span>
|
||||||
|
<p>Flatten slice with one level.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Flatten(slice any) any
|
||||||
|
```
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
arr := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
|
||||||
|
res := slice.Flatten(arr)
|
||||||
|
fmt.Println(res) //{{"a", "b"}, {"c", "d"}}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="FlattenDeep">FlattenDeep</span>
|
### <span id="FlattenDeep">FlattenDeep</span>
|
||||||
<p>flattens slice recursive.</p>
|
<p>flattens slice recursive.</p>
|
||||||
|
|
||||||
@@ -565,7 +593,7 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
arr := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
|
arr := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
|
||||||
res := slice.FlattenDeep(arr)
|
res := slice.FlattenDeep(arr)
|
||||||
fmt.Println(res) //[]string{"a", "b", "c", "d"}
|
fmt.Println(res) //{"a", "b", "c", "d"}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -719,7 +747,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Intersection[T any](slices ...[]T) []T
|
func Intersection[T comparable](slices ...[]T) []T
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -777,7 +805,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func IndexOf[T any](slice []T, value T) int
|
func IndexOf[T comparable](slice []T, value T) int
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -805,7 +833,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func LastIndexOf[T any](slice []T, value T) int
|
func LastIndexOf[T comparable](slice []T, value T) int
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -1040,7 +1068,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func SymmetricDifference[T any](slices ...[]T) []T
|
func SymmetricDifference[T comparable](slices ...[]T) []T
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -1087,7 +1115,7 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="ToSlicePointer">ToSlice</span>
|
### <span id="ToSlicePointer">ToSlicePointer</span>
|
||||||
<p>Returns a pointer to the slices of a variable parameter transformation</p>
|
<p>Returns a pointer to the slices of a variable parameter transformation</p>
|
||||||
|
|
||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
@@ -1106,7 +1134,7 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
str1 := "a"
|
str1 := "a"
|
||||||
str2 := "b"
|
str2 := "b"
|
||||||
res := slice.ToSlice(str1, str2)
|
res := slice.ToSlicePointer(str1, str2)
|
||||||
fmt.Println(res) // res -> []*string{&str1, &str2}
|
fmt.Println(res) // res -> []*string{&str1, &str2}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -1118,7 +1146,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Unique[T any](slice []T) []T
|
func Unique[T comparable](slice []T) []T
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -1142,7 +1170,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func UniqueBy[T any](slice []T, iteratee func(item T) T) []T
|
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -1168,7 +1196,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Union[T any](slices ...[]T) []T
|
func Union[T comparable](slices ...[]T) []T
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
@@ -1222,7 +1250,7 @@ func main() {
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Without[T any](slice []T, values ...T) []T
|
func Without[T comparable](slice []T, values ...T) []T
|
||||||
```
|
```
|
||||||
<b>Example:</b>
|
<b>Example:</b>
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import (
|
|||||||
- [Filter](#Filter)
|
- [Filter](#Filter)
|
||||||
- [Find](#Find)
|
- [Find](#Find)
|
||||||
- [FindLast](#FindLast)
|
- [FindLast](#FindLast)
|
||||||
|
- [Flatten](#Flatten)
|
||||||
- [FlattenDeep](#FlattenDeep)
|
- [FlattenDeep](#FlattenDeep)
|
||||||
- [ForEach](#ForEach)
|
- [ForEach](#ForEach)
|
||||||
|
|
||||||
@@ -74,7 +75,7 @@ import (
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Contain[T any](slice []T, value T) bool
|
func Contain[T comparable](slice []T, value T) bool
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -97,7 +98,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ContainSubSlice[T any](slice, subslice []T) bool
|
func ContainSubSlice[T comparable](slice, subslice []T) bool
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -255,7 +256,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func DifferenceBy[T any](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T
|
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -550,6 +551,30 @@ func main() {
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="Flatten">Flatten</span>
|
||||||
|
<p>将切片压平一层</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Flatten(slice any) any
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
arr := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
|
||||||
|
res := slice.Flatten(arr)
|
||||||
|
fmt.Println(res) //{{"a", "b"}, {"c", "d"}}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="FlattenDeep">FlattenDeep</span>
|
### <span id="FlattenDeep">FlattenDeep</span>
|
||||||
<p>flattens slice recursive.</p>
|
<p>flattens slice recursive.</p>
|
||||||
@@ -722,7 +747,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Intersection[T any](slices ...[]T) []T
|
func Intersection[T comparable](slices ...[]T) []T
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -780,7 +805,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func IndexOf[T any](slice []T, value T) int
|
func IndexOf[T comparable](slice []T, value T) int
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -808,7 +833,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func LastIndexOf[T any](slice []T, value T) int
|
func LastIndexOf[T comparable](slice []T, value T) int
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -1042,7 +1067,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func SymmetricDifference[T any](slices ...[]T) []T
|
func SymmetricDifference[T comparable](slices ...[]T) []T
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -1088,7 +1113,7 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
### <span id="ToSlicePointer">ToSlice</span>
|
### <span id="ToSlicePointer">ToSlicePointer</span>
|
||||||
<p>将可变参数转为指针切片</p>
|
<p>将可变参数转为指针切片</p>
|
||||||
|
|
||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
@@ -1107,7 +1132,7 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
str1 := "a"
|
str1 := "a"
|
||||||
str2 := "b"
|
str2 := "b"
|
||||||
res := slice.ToSlice(str1, str2)
|
res := slice.ToSlicePointer(str1, str2)
|
||||||
fmt.Println(res) // res -> []*string{&str1, &str2}
|
fmt.Println(res) // res -> []*string{&str1, &str2}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -1120,7 +1145,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Unique[T any](slice []T) []T
|
func Unique[T comparable](slice []T) []T
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -1144,7 +1169,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func UniqueBy[T any](slice []T, iteratee func(item T) T) []T
|
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -1170,7 +1195,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Union[T any](slices ...[]T) []T
|
func Union[T comparable](slices ...[]T) []T
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
@@ -1224,7 +1249,7 @@ func main() {
|
|||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Without[T any](slice []T, values ...T) []T
|
func Without[T comparable](slice []T, values ...T) []T
|
||||||
```
|
```
|
||||||
<b>例子:</b>
|
<b>例子:</b>
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import (
|
|||||||
- [RemoveOsEnv](#RemoveOsEnv)
|
- [RemoveOsEnv](#RemoveOsEnv)
|
||||||
- [CompareOsEnv](#CompareOsEnv)
|
- [CompareOsEnv](#CompareOsEnv)
|
||||||
- [ExecCommand](#ExecCommand)
|
- [ExecCommand](#ExecCommand)
|
||||||
|
- [GetOsBits](#GetOsBits)
|
||||||
|
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
@@ -210,7 +211,7 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
### <span id="ExecCommand">CompareOsEnv</span>
|
### <span id="ExecCommand">CompareOsEnv</span>
|
||||||
<p>use shell /bin/bash -c(linux) or cmd (windows) to execute command.</p>
|
<p>Use shell /bin/bash -c(linux) or cmd (windows) to execute command.</p>
|
||||||
|
|
||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
@@ -236,7 +237,27 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="GetOsBits">GetOsBits</span>
|
||||||
|
<p>Get current os bits, 32bit or 64bit. return 32 or 64</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetOsBits() int
|
||||||
|
```
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
osBit := system.GetOsBits()
|
||||||
|
fmt.Println(osBit)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,10 @@ import (
|
|||||||
- [GetOsEnv](#GetOsEnv)
|
- [GetOsEnv](#GetOsEnv)
|
||||||
- [SetOsEnv](#SetOsEnv)
|
- [SetOsEnv](#SetOsEnv)
|
||||||
- [RemoveOsEnv](#RemoveOsEnv)
|
- [RemoveOsEnv](#RemoveOsEnv)
|
||||||
|
|
||||||
- [CompareOsEnv](#CompareOsEnv)
|
- [CompareOsEnv](#CompareOsEnv)
|
||||||
- [ExecCommand](#ExecCommand)
|
- [ExecCommand](#ExecCommand)
|
||||||
|
- [GetOsBits](#GetOsBits)
|
||||||
|
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
@@ -236,6 +238,30 @@ func main() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### <span id="GetOsBits">GetOsBits</span>
|
||||||
|
<p>获取当前操作系统位数,返回32或64</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetOsBits() int
|
||||||
|
```
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
osBit := system.GetOsBits()
|
||||||
|
fmt.Println(osBit)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ func ReadFileByLine(path string) ([]string, error) {
|
|||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
res := make([]string, 0)
|
result := make([]string, 0)
|
||||||
buf := bufio.NewReader(f)
|
buf := bufio.NewReader(f)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
@@ -128,10 +128,10 @@ func ReadFileByLine(path string) ([]string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
res = append(res, l)
|
result = append(result, l)
|
||||||
}
|
}
|
||||||
|
|
||||||
return res, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListFileNames return all file names in the path
|
// ListFileNames return all file names in the path
|
||||||
@@ -150,14 +150,14 @@ func ListFileNames(path string) ([]string, error) {
|
|||||||
return []string{}, nil
|
return []string{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
res := []string{}
|
result := []string{}
|
||||||
for i := 0; i < sz; i++ {
|
for i := 0; i < sz; i++ {
|
||||||
if !fs[i].IsDir() {
|
if !fs[i].IsDir() {
|
||||||
res = append(res, fs[i].Name())
|
result = append(result, fs[i].Name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zip create zip file, fpath could be a single file or a directory
|
// Zip create zip file, fpath could be a single file or a directory
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ func TestCreateFile(t *testing.T) {
|
|||||||
f := "./text.txt"
|
f := "./text.txt"
|
||||||
if CreateFile(f) {
|
if CreateFile(f) {
|
||||||
file, err := os.Open(f)
|
file, err := os.Open(f)
|
||||||
|
defer file.Close()
|
||||||
assert.IsNil(err)
|
assert.IsNil(err)
|
||||||
assert.Equal(f, file.Name())
|
assert.Equal(f, file.Name())
|
||||||
} else {
|
} else {
|
||||||
@@ -111,6 +112,7 @@ func TestReadFileToString(t *testing.T) {
|
|||||||
CreateFile(path)
|
CreateFile(path)
|
||||||
|
|
||||||
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
|
defer f.Close()
|
||||||
f.WriteString("hello world")
|
f.WriteString("hello world")
|
||||||
|
|
||||||
content, _ := ReadFileToString(path)
|
content, _ := ReadFileToString(path)
|
||||||
@@ -218,6 +220,7 @@ func TestMiMeType(t *testing.T) {
|
|||||||
assert := internal.NewAssert(t, "TestMiMeType")
|
assert := internal.NewAssert(t, "TestMiMeType")
|
||||||
|
|
||||||
f, _ := os.Open("./file.go")
|
f, _ := os.Open("./file.go")
|
||||||
|
defer f.Close()
|
||||||
assert.Equal("text/plain; charset=utf-8", MiMeType(f))
|
assert.Equal("text/plain; charset=utf-8", MiMeType(f))
|
||||||
assert.Equal("text/plain; charset=utf-8", MiMeType("./file.go"))
|
assert.Equal("text/plain; charset=utf-8", MiMeType("./file.go"))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,16 +27,16 @@ func After(n int, fn any) func(args ...any) []reflect.Value {
|
|||||||
func Before(n int, fn any) func(args ...any) []reflect.Value {
|
func Before(n int, fn any) func(args ...any) []reflect.Value {
|
||||||
// Catch programming error while constructing the closure
|
// Catch programming error while constructing the closure
|
||||||
mustBeFunction(fn)
|
mustBeFunction(fn)
|
||||||
var res []reflect.Value
|
var result []reflect.Value
|
||||||
return func(args ...any) []reflect.Value {
|
return func(args ...any) []reflect.Value {
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
res = unsafeInvokeFunc(fn, args...)
|
result = unsafeInvokeFunc(fn, args...)
|
||||||
}
|
}
|
||||||
if n <= 0 {
|
if n <= 0 {
|
||||||
fn = nil
|
fn = nil
|
||||||
}
|
}
|
||||||
n--
|
n--
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
logo.png
BIN
logo.png
Binary file not shown.
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 18 KiB |
@@ -8,10 +8,12 @@ import "reflect"
|
|||||||
|
|
||||||
// Keys returns a slice of the map's keys
|
// Keys returns a slice of the map's keys
|
||||||
func Keys[K comparable, V any](m map[K]V) []K {
|
func Keys[K comparable, V any](m map[K]V) []K {
|
||||||
keys := make([]K, 0, len(m))
|
keys := make([]K, len(m))
|
||||||
|
|
||||||
|
var i int
|
||||||
for k := range m {
|
for k := range m {
|
||||||
keys = append(keys, k)
|
keys[i] = k
|
||||||
|
i++
|
||||||
}
|
}
|
||||||
|
|
||||||
return keys
|
return keys
|
||||||
@@ -19,10 +21,12 @@ func Keys[K comparable, V any](m map[K]V) []K {
|
|||||||
|
|
||||||
// Values returns a slice of the map's values
|
// Values returns a slice of the map's values
|
||||||
func Values[K comparable, V any](m map[K]V) []V {
|
func Values[K comparable, V any](m map[K]V) []V {
|
||||||
values := make([]V, 0, len(m))
|
values := make([]V, len(m))
|
||||||
|
|
||||||
|
var i int
|
||||||
for _, v := range m {
|
for _, v := range m {
|
||||||
values = append(values, v)
|
values[i] = v
|
||||||
|
i++
|
||||||
}
|
}
|
||||||
|
|
||||||
return values
|
return values
|
||||||
@@ -30,15 +34,15 @@ func Values[K comparable, V any](m map[K]V) []V {
|
|||||||
|
|
||||||
// Merge maps, next key will overwrite previous key
|
// Merge maps, next key will overwrite previous key
|
||||||
func Merge[K comparable, V any](maps ...map[K]V) map[K]V {
|
func Merge[K comparable, V any](maps ...map[K]V) map[K]V {
|
||||||
res := make(map[K]V, 0)
|
result := make(map[K]V, 0)
|
||||||
|
|
||||||
for _, m := range maps {
|
for _, m := range maps {
|
||||||
for k, v := range m {
|
for k, v := range m {
|
||||||
res[k] = v
|
result[k] = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForEach executes iteratee funcation for every key and value pair in map
|
// ForEach executes iteratee funcation for every key and value pair in map
|
||||||
@@ -50,14 +54,14 @@ func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V)) {
|
|||||||
|
|
||||||
// Filter iterates over map, return a new map contains all key and value pairs pass the predicate function
|
// Filter iterates over map, return a new map contains all key and value pairs pass the predicate function
|
||||||
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V {
|
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V {
|
||||||
res := make(map[K]V)
|
result := make(map[K]V)
|
||||||
|
|
||||||
for k, v := range m {
|
for k, v := range m {
|
||||||
if predicate(k, v) {
|
if predicate(k, v) {
|
||||||
res[k] = v
|
result[k] = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Intersect iterates over maps, return a new map of key and value pairs in all given maps
|
// Intersect iterates over maps, return a new map of key and value pairs in all given maps
|
||||||
@@ -69,7 +73,7 @@ func Intersect[K comparable, V any](maps ...map[K]V) map[K]V {
|
|||||||
return maps[0]
|
return maps[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
var res map[K]V
|
var result map[K]V
|
||||||
|
|
||||||
reducer := func(m1, m2 map[K]V) map[K]V {
|
reducer := func(m1, m2 map[K]V) map[K]V {
|
||||||
m := make(map[K]V)
|
m := make(map[K]V)
|
||||||
@@ -82,25 +86,35 @@ func Intersect[K comparable, V any](maps ...map[K]V) map[K]V {
|
|||||||
}
|
}
|
||||||
|
|
||||||
reduceMaps := make([]map[K]V, 2, 2)
|
reduceMaps := make([]map[K]V, 2, 2)
|
||||||
res = reducer(maps[0], maps[1])
|
result = reducer(maps[0], maps[1])
|
||||||
|
|
||||||
for i := 2; i < len(maps); i++ {
|
for i := 2; i < len(maps); i++ {
|
||||||
reduceMaps[0] = res
|
reduceMaps[0] = result
|
||||||
reduceMaps[1] = maps[i]
|
reduceMaps[1] = maps[i]
|
||||||
res = reducer(reduceMaps[0], reduceMaps[1])
|
result = reducer(reduceMaps[0], reduceMaps[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Minus creates an map of whose key in mapA but not in mapB
|
// Minus creates an map of whose key in mapA but not in mapB
|
||||||
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V {
|
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V {
|
||||||
res := make(map[K]V)
|
result := make(map[K]V)
|
||||||
|
|
||||||
for k, v := range mapA {
|
for k, v := range mapA {
|
||||||
if _, ok := mapB[k]; !ok {
|
if _, ok := mapB[k]; !ok {
|
||||||
res[k] = v
|
result[k] = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsDisjoint two map are disjoint if they have no keys in common
|
||||||
|
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool {
|
||||||
|
for k := range mapA {
|
||||||
|
if _, ok := mapB[k]; ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,3 +148,25 @@ func TestMinus(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(map[string]int{"c": 3}, Minus(m1, m2))
|
assert.Equal(map[string]int{"c": 3}, Minus(m1, m2))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIsDisjoint(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestMinus")
|
||||||
|
|
||||||
|
m1 := map[string]int{
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
"c": 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
m2 := map[string]int{
|
||||||
|
"d": 22,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(true, IsDisjoint(m1, m2))
|
||||||
|
|
||||||
|
m3 := map[string]int{
|
||||||
|
"a": 22,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(false, IsDisjoint(m1, m3))
|
||||||
|
}
|
||||||
|
|||||||
@@ -57,9 +57,9 @@ func Percent(val, total float64, n int) float64 {
|
|||||||
return float64(0)
|
return float64(0)
|
||||||
}
|
}
|
||||||
tmp := val / total * 100
|
tmp := val / total * 100
|
||||||
res := RoundToFloat(tmp, n)
|
result := RoundToFloat(tmp, n)
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// RoundToString round up to n decimal places
|
// RoundToString round up to n decimal places
|
||||||
@@ -67,8 +67,8 @@ func RoundToString(x float64, n int) string {
|
|||||||
tmp := math.Pow(10.0, float64(n))
|
tmp := math.Pow(10.0, float64(n))
|
||||||
x *= tmp
|
x *= tmp
|
||||||
x = math.Round(x)
|
x = math.Round(x)
|
||||||
res := strconv.FormatFloat(x/tmp, 'f', n, 64)
|
result := strconv.FormatFloat(x/tmp, 'f', n, 64)
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// RoundToFloat round up to n decimal places
|
// RoundToFloat round up to n decimal places
|
||||||
@@ -89,8 +89,8 @@ func TruncRound(x float64, n int) float64 {
|
|||||||
} else {
|
} else {
|
||||||
newFloat = temp[0] + "." + temp[1][:n]
|
newFloat = temp[0] + "." + temp[1][:n]
|
||||||
}
|
}
|
||||||
res, _ := strconv.ParseFloat(newFloat, 64)
|
result, _ := strconv.ParseFloat(newFloat, 64)
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Max return max value of params
|
// Max return max value of params
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
// HttpGet, HttpPost, HttpDelete, HttpPut, HttpPatch, function param `url` is required.
|
// HttpGet, HttpPost, HttpDelete, HttpPut, HttpPatch, function param `url` is required.
|
||||||
// HttpGet, HttpPost, HttpDelete, HttpPut, HttpPatch, function param `params` is variable, the order is:
|
// HttpGet, HttpPost, HttpDelete, HttpPut, HttpPatch, function param `params` is variable, the order is:
|
||||||
// params[0] is header which type should be http.Header or map[string]string,
|
// params[0] is header which type should be http.Header or map[string]string,
|
||||||
// params[1] is query param which type should be url.Values or map[string]any, when content-type header is
|
// params[1] is query string param which type should be url.Values or map[string]string, when content-type header is
|
||||||
// multipart/form-data or application/x-www-form-urlencoded, params[1] should be url.Values
|
// multipart/form-data or application/x-www-form-urlencoded
|
||||||
// params[2] is post body which type should be []byte.
|
// params[2] is post body which type should be []byte.
|
||||||
// params[3] is http client which type should be http.Client.
|
// params[3] is http client which type should be http.Client.
|
||||||
package netutil
|
package netutil
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net/url"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/duke-git/lancet/v2/internal"
|
"github.com/duke-git/lancet/v2/internal"
|
||||||
@@ -57,9 +56,13 @@ func TestHttpPostFormData(t *testing.T) {
|
|||||||
UserId int `json:"userId"`
|
UserId int `json:"userId"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
}
|
}
|
||||||
postData := url.Values{}
|
// postData := url.Values{}
|
||||||
postData.Add("userId", "1")
|
// postData.Add("userId", "1")
|
||||||
postData.Add("title", "TestAddToDo")
|
// postData.Add("title", "TestAddToDo")
|
||||||
|
|
||||||
|
postData := make(map[string]string)
|
||||||
|
postData["userId"] = "1"
|
||||||
|
postData["title"] = "title"
|
||||||
|
|
||||||
resp, err := HttpPost(apiUrl, header, postData, nil)
|
resp, err := HttpPost(apiUrl, header, postData, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetInternalIp return internal ipv4
|
// GetInternalIp return internal ipv4
|
||||||
@@ -24,6 +26,26 @@ func GetInternalIp() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetRequestPublicIp return the requested public ip
|
||||||
|
func GetRequestPublicIp(req *http.Request) string {
|
||||||
|
var ip string
|
||||||
|
for _, ip = range strings.Split(req.Header.Get("X-Forwarded-For"), ",") {
|
||||||
|
if ip = strings.TrimSpace(ip); ip != "" && !IsInternalIP(net.ParseIP(ip)) {
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ip = strings.TrimSpace(req.Header.Get("X-Real-Ip")); ip != "" && !IsInternalIP(net.ParseIP(ip)) {
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
|
||||||
|
if ip, _, _ = net.SplitHostPort(req.RemoteAddr); !IsInternalIP(net.ParseIP(ip)) {
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
|
||||||
// GetPublicIpInfo return public ip information
|
// GetPublicIpInfo return public ip information
|
||||||
// return the PublicIpInfo struct
|
// return the PublicIpInfo struct
|
||||||
func GetPublicIpInfo() (*PublicIpInfo, error) {
|
func GetPublicIpInfo() (*PublicIpInfo, error) {
|
||||||
@@ -122,3 +144,29 @@ func IsPublicIP(IP net.IP) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsInternalIP verify an ip is intranet or not
|
||||||
|
func IsInternalIP(IP net.IP) bool {
|
||||||
|
if IP.IsLoopback() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if ip4 := IP.To4(); ip4 != nil {
|
||||||
|
return ip4[0] == 10 ||
|
||||||
|
(ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) ||
|
||||||
|
(ip4[0] == 169 && ip4[1] == 254) ||
|
||||||
|
(ip4[0] == 192 && ip4[1] == 168)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncodeUrl encode url
|
||||||
|
func EncodeUrl(urlStr string) (string, error) {
|
||||||
|
URL, err := url.Parse(urlStr)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
URL.RawQuery = URL.Query().Encode()
|
||||||
|
|
||||||
|
return URL.String(), nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package netutil
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
@@ -81,9 +80,18 @@ func setHeaderAndQueryAndBody(req *http.Request, reqUrl string, header, queryPar
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if req.Header.Get("Content-Type") == "multipart/form-data" || req.Header.Get("Content-Type") == "application/x-www-form-urlencoded" {
|
if strings.Contains(req.Header.Get("Content-Type"), "multipart/form-data") || req.Header.Get("Content-Type") == "application/x-www-form-urlencoded" {
|
||||||
formData := queryParam.(url.Values)
|
if formData, ok := queryParam.(url.Values); ok {
|
||||||
err = setBodyByte(req, []byte(formData.Encode()))
|
err = setBodyByte(req, []byte(formData.Encode()))
|
||||||
|
}
|
||||||
|
if formData, ok := queryParam.(map[string]string); ok {
|
||||||
|
postData := url.Values{}
|
||||||
|
for k, v := range formData {
|
||||||
|
postData.Set(k, v)
|
||||||
|
}
|
||||||
|
err = setBodyByte(req, []byte(postData.Encode()))
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
err = setBodyByte(req, body)
|
err = setBodyByte(req, body)
|
||||||
}
|
}
|
||||||
@@ -132,15 +140,15 @@ func setQueryParam(req *http.Request, reqUrl string, queryParam any) error {
|
|||||||
var values url.Values
|
var values url.Values
|
||||||
if queryParam != nil {
|
if queryParam != nil {
|
||||||
switch v := queryParam.(type) {
|
switch v := queryParam.(type) {
|
||||||
case map[string]any:
|
case map[string]string:
|
||||||
values = url.Values{}
|
values = url.Values{}
|
||||||
for k := range v {
|
for k := range v {
|
||||||
values.Set(k, fmt.Sprintf("%v", v[k]))
|
values.Set(k, v[k])
|
||||||
}
|
}
|
||||||
case url.Values:
|
case url.Values:
|
||||||
values = v
|
values = v
|
||||||
default:
|
default:
|
||||||
return errors.New("query params type should be url.Values or map[string]any")
|
return errors.New("query string params type should be url.Values or map[string]string")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package netutil
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/duke-git/lancet/v2/internal"
|
"github.com/duke-git/lancet/v2/internal"
|
||||||
@@ -15,6 +16,30 @@ func TestGetInternalIp(t *testing.T) {
|
|||||||
assert.IsNotNil(ip)
|
assert.IsNotNil(ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetRequestPublicIp(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestGetPublicIpInfo")
|
||||||
|
|
||||||
|
ip := "36.112.24.10"
|
||||||
|
|
||||||
|
request := http.Request{
|
||||||
|
Method: "GET",
|
||||||
|
Header: http.Header{
|
||||||
|
"X-Forwarded-For": {ip},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
publicIp := GetRequestPublicIp(&request)
|
||||||
|
assert.Equal(publicIp, ip)
|
||||||
|
|
||||||
|
request = http.Request{
|
||||||
|
Method: "GET",
|
||||||
|
Header: http.Header{
|
||||||
|
"X-Real-Ip": {ip},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
publicIp = GetRequestPublicIp(&request)
|
||||||
|
assert.Equal(publicIp, ip)
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetPublicIpInfo(t *testing.T) {
|
func TestGetPublicIpInfo(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestGetPublicIpInfo")
|
assert := internal.NewAssert(t, "TestGetPublicIpInfo")
|
||||||
|
|
||||||
@@ -43,6 +68,25 @@ func TestIsPublicIP(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIsInternalIP(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestIsInternalIP")
|
||||||
|
|
||||||
|
ips := []net.IP{
|
||||||
|
net.ParseIP("127.0.0.1"),
|
||||||
|
net.ParseIP("192.168.0.1"),
|
||||||
|
net.ParseIP("10.91.210.131"),
|
||||||
|
net.ParseIP("172.20.16.1"),
|
||||||
|
net.ParseIP("36.112.24.10"),
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := []bool{true, true, true, true, false}
|
||||||
|
|
||||||
|
for i := 0; i < len(ips); i++ {
|
||||||
|
actual := IsInternalIP(ips[i])
|
||||||
|
assert.Equal(expected[i], actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetIps(t *testing.T) {
|
func TestGetIps(t *testing.T) {
|
||||||
ips := GetIps()
|
ips := GetIps()
|
||||||
t.Log(ips)
|
t.Log(ips)
|
||||||
@@ -52,3 +96,16 @@ func TestGetMacAddrs(t *testing.T) {
|
|||||||
macAddrs := GetMacAddrs()
|
macAddrs := GetMacAddrs()
|
||||||
t.Log(macAddrs)
|
t.Log(macAddrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEncodeUrl(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestIsInternalIP")
|
||||||
|
|
||||||
|
urlAddr := "http://www.lancet.com?a=1&b=[2]"
|
||||||
|
encodedUrl, err := EncodeUrl(urlAddr)
|
||||||
|
if err != nil {
|
||||||
|
t.Log(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := "http://www.lancet.com?a=1&b=%5B2%5D"
|
||||||
|
assert.Equal(expected, encodedUrl)
|
||||||
|
}
|
||||||
|
|||||||
202
slice/slice.go
202
slice/slice.go
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2021 dudaodong@gmail.com. All rights reserved.
|
// Copyright 2021 dudaodong@gmail.com. All rights resulterved.
|
||||||
// Use of this source code is governed by MIT license
|
// Use of this source code is governed by MIT license
|
||||||
|
|
||||||
// Package slice implements some functions to manipulate slice.
|
// Package slice implements some functions to manipulate slice.
|
||||||
@@ -13,9 +13,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Contain check if the value is in the slice or not
|
// Contain check if the value is in the slice or not
|
||||||
func Contain[T any](slice []T, value T) bool {
|
func Contain[T comparable](slice []T, value T) bool {
|
||||||
for _, v := range slice {
|
for _, v := range slice {
|
||||||
if reflect.DeepEqual(v, value) {
|
if v == value {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,7 @@ func Contain[T any](slice []T, value T) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ContainSubSlice check if the slice contain subslice or not
|
// ContainSubSlice check if the slice contain subslice or not
|
||||||
func ContainSubSlice[T any](slice, subslice []T) bool {
|
func ContainSubSlice[T comparable](slice, subslice []T) bool {
|
||||||
for _, v := range subslice {
|
for _, v := range subslice {
|
||||||
if !Contain(slice, v) {
|
if !Contain(slice, v) {
|
||||||
return false
|
return false
|
||||||
@@ -36,10 +36,10 @@ func ContainSubSlice[T any](slice, subslice []T) bool {
|
|||||||
|
|
||||||
// Chunk creates an slice of elements split into groups the length of size.
|
// Chunk creates an slice of elements split into groups the length of size.
|
||||||
func Chunk[T any](slice []T, size int) [][]T {
|
func Chunk[T any](slice []T, size int) [][]T {
|
||||||
var res [][]T
|
var result [][]T
|
||||||
|
|
||||||
if len(slice) == 0 || size <= 0 {
|
if len(slice) == 0 || size <= 0 {
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
length := len(slice)
|
length := len(slice)
|
||||||
@@ -47,9 +47,9 @@ func Chunk[T any](slice []T, size int) [][]T {
|
|||||||
for _, v := range slice {
|
for _, v := range slice {
|
||||||
var tmp []T
|
var tmp []T
|
||||||
tmp = append(tmp, v)
|
tmp = append(tmp, v)
|
||||||
res = append(res, tmp)
|
result = append(result, tmp)
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// divide slice equally
|
// divide slice equally
|
||||||
@@ -57,74 +57,74 @@ func Chunk[T any](slice []T, size int) [][]T {
|
|||||||
for i := 0; i < divideNum; i++ {
|
for i := 0; i < divideNum; i++ {
|
||||||
if i == divideNum-1 {
|
if i == divideNum-1 {
|
||||||
if len(slice[i*size:]) > 0 {
|
if len(slice[i*size:]) > 0 {
|
||||||
res = append(res, slice[i*size:])
|
result = append(result, slice[i*size:])
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
res = append(res, slice[i*size:(i+1)*size])
|
result = append(result, slice[i*size:(i+1)*size])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compact creates an slice with all falsey values removed. The values false, nil, 0, and "" are falsey
|
// Compact creates an slice with all falsey values removed. The values false, nil, 0, and "" are falsey
|
||||||
func Compact[T any](slice []T) []T {
|
func Compact[T any](slice []T) []T {
|
||||||
res := make([]T, 0, 0)
|
result := make([]T, 0, 0)
|
||||||
for _, v := range slice {
|
for _, v := range slice {
|
||||||
if !reflect.DeepEqual(v, nil) &&
|
if !reflect.DeepEqual(v, nil) &&
|
||||||
!reflect.DeepEqual(v, false) &&
|
!reflect.DeepEqual(v, false) &&
|
||||||
!reflect.DeepEqual(v, "") &&
|
!reflect.DeepEqual(v, "") &&
|
||||||
!reflect.DeepEqual(v, 0) {
|
!reflect.DeepEqual(v, 0) {
|
||||||
res = append(res, v)
|
result = append(result, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Concat creates a new slice concatenating slice with any additional slices and/or values.
|
// Concat creates a new slice concatenating slice with any additional slices and/or values.
|
||||||
func Concat[T any](slice []T, values ...[]T) []T {
|
func Concat[T any](slice []T, values ...[]T) []T {
|
||||||
res := append([]T{}, slice...)
|
result := append([]T{}, slice...)
|
||||||
|
|
||||||
for _, v := range values {
|
for _, v := range values {
|
||||||
res = append(res, v...)
|
result = append(result, v...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Difference creates an slice of whose element in slice but not in comparedSlice
|
// Difference creates an slice of whose element in slice but not in comparedSlice
|
||||||
func Difference[T comparable](slice, comparedSlice []T) []T {
|
func Difference[T comparable](slice, comparedSlice []T) []T {
|
||||||
var res []T
|
var result []T
|
||||||
for _, v := range slice {
|
for _, v := range slice {
|
||||||
if !Contain(comparedSlice, v) {
|
if !Contain(comparedSlice, v) {
|
||||||
res = append(res, v)
|
result = append(result, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// DifferenceBy it accepts iteratee which is invoked for each element of slice
|
// DifferenceBy it accepts iteratee which is invoked for each element of slice
|
||||||
// and values to generate the criterion by which they're compared.
|
// and values to generate the criterion by which they're compared.
|
||||||
// like lodash.js differenceBy: https://lodash.com/docs/4.17.15#differenceBy,
|
// like lodash.js differenceBy: https://lodash.com/docs/4.17.15#differenceBy,
|
||||||
func DifferenceBy[T any](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T {
|
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T {
|
||||||
orginSliceAfterMap := Map(slice, iteratee)
|
orginSliceAfterMap := Map(slice, iteratee)
|
||||||
comparedSliceAfterMap := Map(comparedSlice, iteratee)
|
comparedSliceAfterMap := Map(comparedSlice, iteratee)
|
||||||
|
|
||||||
res := make([]T, 0, 0)
|
result := make([]T, 0, 0)
|
||||||
for i, v := range orginSliceAfterMap {
|
for i, v := range orginSliceAfterMap {
|
||||||
if !Contain(comparedSliceAfterMap, v) {
|
if !Contain(comparedSliceAfterMap, v) {
|
||||||
res = append(res, slice[i])
|
result = append(result, slice[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
//DifferenceWith accepts comparator which is invoked to compare elements of slice to values. The order and references of result values are determined by the first slice. The comparator is invoked with two arguments: (arrVal, othVal).
|
//DifferenceWith accepts comparator which is invoked to compare elements of slice to values. The order and references of result values are determined by the first slice. The comparator is invoked with two arguments: (arrVal, othVal).
|
||||||
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T {
|
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T {
|
||||||
res := make([]T, 0, 0)
|
result := make([]T, 0, 0)
|
||||||
|
|
||||||
getIndex := func(arr []T, item T, comparison func(v1, v2 T) bool) int {
|
getIndex := func(arr []T, item T, comparison func(v1, v2 T) bool) int {
|
||||||
index := -1
|
index := -1
|
||||||
@@ -140,11 +140,11 @@ func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value,
|
|||||||
for i, v := range slice {
|
for i, v := range slice {
|
||||||
index := getIndex(comparedSlice, v, comparator)
|
index := getIndex(comparedSlice, v, comparator)
|
||||||
if index == -1 {
|
if index == -1 {
|
||||||
res = append(res, slice[i])
|
result = append(result, slice[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equal checks if two slices are equal: the same length and all elements' order and value are equal
|
// Equal checks if two slices are equal: the same length and all elements' order and value are equal
|
||||||
@@ -230,13 +230,13 @@ func Filter[T any](slice []T, predicate func(index int, item T) bool) []T {
|
|||||||
panic("predicate func is missing")
|
panic("predicate func is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
res := make([]T, 0, 0)
|
result := make([]T, 0, 0)
|
||||||
for i, v := range slice {
|
for i, v := range slice {
|
||||||
if predicate(i, v) {
|
if predicate(i, v) {
|
||||||
res = append(res, v)
|
result = append(result, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count iterates over elements of slice, returns a count of all matched elements
|
// Count iterates over elements of slice, returns a count of all matched elements
|
||||||
@@ -284,23 +284,23 @@ func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)
|
|||||||
return groupA, groupB
|
return groupA, groupB
|
||||||
}
|
}
|
||||||
|
|
||||||
// GroupWith return a map composed of keys generated from the results of running each element of slice thru iteratee.
|
// GroupWith return a map composed of keys generated from the resultults of running each element of slice thru iteratee.
|
||||||
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T {
|
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T {
|
||||||
if iteratee == nil {
|
if iteratee == nil {
|
||||||
panic("iteratee func is missing")
|
panic("iteratee func is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
res := make(map[U][]T)
|
result := make(map[U][]T)
|
||||||
|
|
||||||
for _, v := range slice {
|
for _, v := range slice {
|
||||||
key := iteratee(v)
|
key := iteratee(v)
|
||||||
if _, ok := res[key]; !ok {
|
if _, ok := result[key]; !ok {
|
||||||
res[key] = []T{}
|
result[key] = []T{}
|
||||||
}
|
}
|
||||||
res[key] = append(res[key], v)
|
result[key] = append(result[key], v)
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find iterates over elements of slice, returning the first one that passes a truth test on predicate function.
|
// Find iterates over elements of slice, returning the first one that passes a truth test on predicate function.
|
||||||
@@ -355,13 +355,40 @@ func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, boo
|
|||||||
return &slice[index], true
|
return &slice[index], true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Flatten flattens slice with one level
|
||||||
|
func Flatten(slice any) any {
|
||||||
|
sv := sliceValue(slice)
|
||||||
|
|
||||||
|
var result reflect.Value
|
||||||
|
if sv.Type().Elem().Kind() == reflect.Interface {
|
||||||
|
result = reflect.MakeSlice(reflect.TypeOf([]interface{}{}), 0, sv.Len())
|
||||||
|
} else if sv.Type().Elem().Kind() == reflect.Slice {
|
||||||
|
result = reflect.MakeSlice(sv.Type().Elem(), 0, sv.Len())
|
||||||
|
} else {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < sv.Len(); i++ {
|
||||||
|
item := reflect.ValueOf(sv.Index(i).Interface())
|
||||||
|
if item.Kind() == reflect.Slice {
|
||||||
|
for j := 0; j < item.Len(); j++ {
|
||||||
|
result = reflect.Append(result, item.Index(j))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = reflect.Append(result, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.Interface()
|
||||||
|
}
|
||||||
|
|
||||||
// FlattenDeep flattens slice recursive
|
// FlattenDeep flattens slice recursive
|
||||||
func FlattenDeep(slice any) any {
|
func FlattenDeep(slice any) any {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
st := sliceElemType(sv.Type())
|
st := sliceElemType(sv.Type())
|
||||||
tmp := reflect.MakeSlice(reflect.SliceOf(st), 0, 0)
|
tmp := reflect.MakeSlice(reflect.SliceOf(st), 0, 0)
|
||||||
res := flattenRecursive(sv, tmp)
|
result := flattenRecursive(sv, tmp)
|
||||||
return res.Interface()
|
return result.Interface()
|
||||||
}
|
}
|
||||||
|
|
||||||
func flattenRecursive(value reflect.Value, result reflect.Value) reflect.Value {
|
func flattenRecursive(value reflect.Value, result reflect.Value) reflect.Value {
|
||||||
@@ -396,12 +423,12 @@ func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U {
|
|||||||
panic("iteratee func is missing")
|
panic("iteratee func is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
res := make([]U, len(slice), cap(slice))
|
result := make([]U, len(slice), cap(slice))
|
||||||
for i, v := range slice {
|
for i, v := range slice {
|
||||||
res[i] = iteratee(i, v)
|
result[i] = iteratee(i, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reduce creates an slice of values by running each element of slice thru iteratee function.
|
// Reduce creates an slice of values by running each element of slice thru iteratee function.
|
||||||
@@ -414,16 +441,16 @@ func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initia
|
|||||||
return initial
|
return initial
|
||||||
}
|
}
|
||||||
|
|
||||||
res := iteratee(0, initial, slice[0])
|
result := iteratee(0, initial, slice[0])
|
||||||
|
|
||||||
tmp := make([]T, 2, 2)
|
tmp := make([]T, 2, 2)
|
||||||
for i := 1; i < len(slice); i++ {
|
for i := 1; i < len(slice); i++ {
|
||||||
tmp[0] = res
|
tmp[0] = result
|
||||||
tmp[1] = slice[i]
|
tmp[1] = slice[i]
|
||||||
res = iteratee(i, tmp[0], tmp[1])
|
result = iteratee(i, tmp[0], tmp[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// InterfaceSlice convert param to slice of interface.
|
// InterfaceSlice convert param to slice of interface.
|
||||||
@@ -433,12 +460,12 @@ func InterfaceSlice(slice any) []any {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
res := make([]any, sv.Len())
|
result := make([]any, sv.Len())
|
||||||
for i := 0; i < sv.Len(); i++ {
|
for i := 0; i < sv.Len(); i++ {
|
||||||
res[i] = sv.Index(i).Interface()
|
result[i] = sv.Index(i).Interface()
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// StringSlice convert param to slice of string.
|
// StringSlice convert param to slice of string.
|
||||||
@@ -530,13 +557,11 @@ func InsertAt[T any](slice []T, index int, value any) []T {
|
|||||||
return slice
|
return slice
|
||||||
}
|
}
|
||||||
|
|
||||||
// value is T
|
|
||||||
if v, ok := value.(T); ok {
|
if v, ok := value.(T); ok {
|
||||||
slice = append(slice[:index], append([]T{v}, slice[index:]...)...)
|
slice = append(slice[:index], append([]T{v}, slice[index:]...)...)
|
||||||
return slice
|
return slice
|
||||||
}
|
}
|
||||||
|
|
||||||
// value is []T
|
|
||||||
if v, ok := value.([]T); ok {
|
if v, ok := value.([]T); ok {
|
||||||
slice = append(slice[:index], append(v, slice[index:]...)...)
|
slice = append(slice[:index], append(v, slice[index:]...)...)
|
||||||
return slice
|
return slice
|
||||||
@@ -558,47 +583,47 @@ func UpdateAt[T any](slice []T, index int, value T) []T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Unique remove duplicate elements in slice.
|
// Unique remove duplicate elements in slice.
|
||||||
func Unique[T any](slice []T) []T {
|
func Unique[T comparable](slice []T) []T {
|
||||||
if len(slice) == 0 {
|
if len(slice) == 0 {
|
||||||
return []T{}
|
return []T{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// here no use map filter. if use it, the result slice element order is random, not same as origin slice
|
// here no use map filter. if use it, the result slice element order is random, not same as origin slice
|
||||||
var res []T
|
var result []T
|
||||||
for i := 0; i < len(slice); i++ {
|
for i := 0; i < len(slice); i++ {
|
||||||
v := slice[i]
|
v := slice[i]
|
||||||
skip := true
|
skip := true
|
||||||
for j := range res {
|
for j := range result {
|
||||||
if reflect.DeepEqual(v, res[j]) {
|
if v == result[j] {
|
||||||
skip = false
|
skip = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if skip {
|
if skip {
|
||||||
res = append(res, v)
|
result = append(result, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// UniqueBy call iteratee func with every item of slice, then remove duplicated.
|
// UniqueBy call iteratee func with every item of slice, then remove duplicated.
|
||||||
func UniqueBy[T any](slice []T, iteratee func(item T) T) []T {
|
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T {
|
||||||
if len(slice) == 0 {
|
if len(slice) == 0 {
|
||||||
return []T{}
|
return []T{}
|
||||||
}
|
}
|
||||||
|
|
||||||
var res []T
|
var result []T
|
||||||
for _, v := range slice {
|
for _, v := range slice {
|
||||||
val := iteratee(v)
|
val := iteratee(v)
|
||||||
res = append(res, val)
|
result = append(result, val)
|
||||||
}
|
}
|
||||||
|
|
||||||
return Unique(res)
|
return Unique(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Union creates a slice of unique values, in order, from all given slices. using == for equality comparisons.
|
// Union creates a slice of unique values, in order, from all given slices. using == for equality comparisons.
|
||||||
func Union[T any](slices ...[]T) []T {
|
func Union[T comparable](slices ...[]T) []T {
|
||||||
if len(slices) == 0 {
|
if len(slices) == 0 {
|
||||||
return []T{}
|
return []T{}
|
||||||
}
|
}
|
||||||
@@ -616,7 +641,7 @@ func Union[T any](slices ...[]T) []T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Intersection creates a slice of unique values that included by all slices.
|
// Intersection creates a slice of unique values that included by all slices.
|
||||||
func Intersection[T any](slices ...[]T) []T {
|
func Intersection[T comparable](slices ...[]T) []T {
|
||||||
if len(slices) == 0 {
|
if len(slices) == 0 {
|
||||||
return []T{}
|
return []T{}
|
||||||
}
|
}
|
||||||
@@ -624,32 +649,38 @@ func Intersection[T any](slices ...[]T) []T {
|
|||||||
return Unique(slices[0])
|
return Unique(slices[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
var res []T
|
var result []T
|
||||||
|
|
||||||
reducer := func(s1, s2 []T) []T {
|
reducer := func(sliceA, sliceB []T) []T {
|
||||||
s := make([]T, 0, 0)
|
hashMap := make(map[T]int)
|
||||||
for _, v := range s1 {
|
for _, val := range sliceA {
|
||||||
if Contain(s2, v) {
|
hashMap[val] = 1
|
||||||
s = append(s, v)
|
}
|
||||||
|
|
||||||
|
out := make([]T, 0)
|
||||||
|
for _, val := range sliceB {
|
||||||
|
if v, ok := hashMap[val]; v == 1 && ok {
|
||||||
|
out = append(out, val)
|
||||||
|
hashMap[val]++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return s
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
res = reducer(slices[0], slices[1])
|
result = reducer(slices[0], slices[1])
|
||||||
|
|
||||||
reduceSlice := make([][]T, 2, 2)
|
reduceSlice := make([][]T, 2, 2)
|
||||||
for i := 2; i < len(slices); i++ {
|
for i := 2; i < len(slices); i++ {
|
||||||
reduceSlice[0] = res
|
reduceSlice[0] = result
|
||||||
reduceSlice[1] = slices[i]
|
reduceSlice[1] = slices[i]
|
||||||
res = reducer(reduceSlice[0], reduceSlice[1])
|
result = reducer(reduceSlice[0], reduceSlice[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
return Unique(res)
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// SymmetricDifference oppoiste operation of intersection function
|
// SymmetricDifference oppoiste operation of intersection function
|
||||||
func SymmetricDifference[T any](slices ...[]T) []T {
|
func SymmetricDifference[T comparable](slices ...[]T) []T {
|
||||||
if len(slices) == 0 {
|
if len(slices) == 0 {
|
||||||
return []T{}
|
return []T{}
|
||||||
}
|
}
|
||||||
@@ -657,7 +688,7 @@ func SymmetricDifference[T any](slices ...[]T) []T {
|
|||||||
return Unique(slices[0])
|
return Unique(slices[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
res := make([]T, 0)
|
result := make([]T, 0)
|
||||||
|
|
||||||
intersectSlice := Intersection(slices...)
|
intersectSlice := Intersection(slices...)
|
||||||
|
|
||||||
@@ -665,13 +696,13 @@ func SymmetricDifference[T any](slices ...[]T) []T {
|
|||||||
slice := slices[i]
|
slice := slices[i]
|
||||||
for _, v := range slice {
|
for _, v := range slice {
|
||||||
if !Contain(intersectSlice, v) {
|
if !Contain(intersectSlice, v) {
|
||||||
res = append(res, v)
|
result = append(result, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Unique(res)
|
return Unique(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reverse return slice of element order is reversed to the given slice
|
// Reverse return slice of element order is reversed to the given slice
|
||||||
@@ -683,13 +714,12 @@ func Reverse[T any](slice []T) {
|
|||||||
|
|
||||||
// Shuffle creates an slice of shuffled values
|
// Shuffle creates an slice of shuffled values
|
||||||
func Shuffle[T any](slice []T) []T {
|
func Shuffle[T any](slice []T) []T {
|
||||||
|
result := make([]T, len(slice))
|
||||||
res := make([]T, len(slice))
|
|
||||||
for i, v := range rand.Perm(len(slice)) {
|
for i, v := range rand.Perm(len(slice)) {
|
||||||
res[i] = slice[v]
|
result[i] = slice[v]
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// SortByField return sorted slice by field
|
// SortByField return sorted slice by field
|
||||||
@@ -765,7 +795,7 @@ func SortByField(slice any, field string, sortType ...string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Without creates a slice excluding all given values
|
// Without creates a slice excluding all given values
|
||||||
func Without[T any](slice []T, values ...T) []T {
|
func Without[T comparable](slice []T, values ...T) []T {
|
||||||
if len(values) == 0 || len(slice) == 0 {
|
if len(values) == 0 || len(slice) == 0 {
|
||||||
return slice
|
return slice
|
||||||
}
|
}
|
||||||
@@ -782,9 +812,9 @@ func Without[T any](slice []T, values ...T) []T {
|
|||||||
|
|
||||||
// IndexOf returns the index at which the first occurrence of a value is found in a slice or return -1
|
// IndexOf returns the index at which the first occurrence of a value is found in a slice or return -1
|
||||||
// if the value cannot be found.
|
// if the value cannot be found.
|
||||||
func IndexOf[T any](slice []T, value T) int {
|
func IndexOf[T comparable](slice []T, value T) int {
|
||||||
for i, v := range slice {
|
for i, v := range slice {
|
||||||
if reflect.DeepEqual(v, value) {
|
if v == value {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -794,9 +824,9 @@ func IndexOf[T any](slice []T, value T) int {
|
|||||||
|
|
||||||
// LastIndexOf returns the index at which the last occurrence of a value is found in a slice or return -1
|
// LastIndexOf returns the index at which the last occurrence of a value is found in a slice or return -1
|
||||||
// if the value cannot be found.
|
// if the value cannot be found.
|
||||||
func LastIndexOf[T any](slice []T, value T) int {
|
func LastIndexOf[T comparable](slice []T, value T) int {
|
||||||
for i := len(slice) - 1; i > 0; i-- {
|
for i := len(slice) - 1; i > 0; i-- {
|
||||||
if reflect.DeepEqual(value, slice[i]) {
|
if value == slice[i] {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -236,6 +236,14 @@ func TestFindFoundNothing(t *testing.T) {
|
|||||||
assert.Equal(false, ok)
|
assert.Equal(false, ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFlatten(t *testing.T) {
|
||||||
|
input := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
|
||||||
|
expected := [][]string{{"a", "b"}, {"c", "d"}}
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestFlattenDeep")
|
||||||
|
assert.Equal(expected, Flatten(input))
|
||||||
|
}
|
||||||
|
|
||||||
func TestFlattenDeep(t *testing.T) {
|
func TestFlattenDeep(t *testing.T) {
|
||||||
input := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
|
input := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
|
||||||
expected := []string{"a", "b", "c", "d"}
|
expected := []string{"a", "b", "c", "d"}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func CamelCase(s string) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
res := ""
|
result := ""
|
||||||
blankSpace := " "
|
blankSpace := " "
|
||||||
regex, _ := regexp.Compile("[-_&]+")
|
regex, _ := regexp.Compile("[-_&]+")
|
||||||
ss := regex.ReplaceAllString(s, blankSpace)
|
ss := regex.ReplaceAllString(s, blankSpace)
|
||||||
@@ -26,13 +26,13 @@ func CamelCase(s string) string {
|
|||||||
if vv[i] >= 65 && vv[i] <= 96 {
|
if vv[i] >= 65 && vv[i] <= 96 {
|
||||||
vv[0] += 32
|
vv[0] += 32
|
||||||
}
|
}
|
||||||
res += string(vv)
|
result += string(vv)
|
||||||
} else {
|
} else {
|
||||||
res += Capitalize(v)
|
result += Capitalize(v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Capitalize converts the first character of a string to upper case and the remaining to lower case.
|
// Capitalize converts the first character of a string to upper case and the remaining to lower case.
|
||||||
@@ -126,15 +126,15 @@ func KebabCase(s string) string {
|
|||||||
match := regex.ReplaceAllString(s, blankSpace)
|
match := regex.ReplaceAllString(s, blankSpace)
|
||||||
rs := strings.Split(match, blankSpace)
|
rs := strings.Split(match, blankSpace)
|
||||||
|
|
||||||
var res []string
|
var result []string
|
||||||
for _, v := range rs {
|
for _, v := range rs {
|
||||||
splitWords := splitWordsToLower(v)
|
splitWords := splitWordsToLower(v)
|
||||||
if len(splitWords) > 0 {
|
if len(splitWords) > 0 {
|
||||||
res = append(res, splitWords...)
|
result = append(result, splitWords...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(res, "-")
|
return strings.Join(result, "-")
|
||||||
}
|
}
|
||||||
|
|
||||||
// SnakeCase covert string to snake_case
|
// SnakeCase covert string to snake_case
|
||||||
@@ -148,15 +148,15 @@ func SnakeCase(s string) string {
|
|||||||
match := regex.ReplaceAllString(s, blankSpace)
|
match := regex.ReplaceAllString(s, blankSpace)
|
||||||
rs := strings.Split(match, blankSpace)
|
rs := strings.Split(match, blankSpace)
|
||||||
|
|
||||||
var res []string
|
var result []string
|
||||||
for _, v := range rs {
|
for _, v := range rs {
|
||||||
splitWords := splitWordsToLower(v)
|
splitWords := splitWordsToLower(v)
|
||||||
if len(splitWords) > 0 {
|
if len(splitWords) > 0 {
|
||||||
res = append(res, splitWords...)
|
result = append(result, splitWords...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(res, "_")
|
return strings.Join(result, "_")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Before create substring in source string before position when char first appear
|
// Before create substring in source string before position when char first appear
|
||||||
|
|||||||
@@ -4,37 +4,37 @@ import "strings"
|
|||||||
|
|
||||||
// splitWordsToLower split a string into worlds by uppercase char
|
// splitWordsToLower split a string into worlds by uppercase char
|
||||||
func splitWordsToLower(s string) []string {
|
func splitWordsToLower(s string) []string {
|
||||||
var res []string
|
var result []string
|
||||||
|
|
||||||
upperIndexes := upperIndex(s)
|
upperIndexes := upperIndex(s)
|
||||||
l := len(upperIndexes)
|
l := len(upperIndexes)
|
||||||
if upperIndexes == nil || l == 0 {
|
if upperIndexes == nil || l == 0 {
|
||||||
if s != "" {
|
if s != "" {
|
||||||
res = append(res, s)
|
result = append(result, s)
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
for i := 0; i < l; i++ {
|
for i := 0; i < l; i++ {
|
||||||
if i < l-1 {
|
if i < l-1 {
|
||||||
res = append(res, strings.ToLower(s[upperIndexes[i]:upperIndexes[i+1]]))
|
result = append(result, strings.ToLower(s[upperIndexes[i]:upperIndexes[i+1]]))
|
||||||
} else {
|
} else {
|
||||||
res = append(res, strings.ToLower(s[upperIndexes[i]:]))
|
result = append(result, strings.ToLower(s[upperIndexes[i]:]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// upperIndex get a int slice which elements are all the uppercase char index of a string
|
// upperIndex get a int slice which elements are all the uppercase char index of a string
|
||||||
func upperIndex(s string) []int {
|
func upperIndex(s string) []int {
|
||||||
var res []int
|
var result []int
|
||||||
for i := 0; i < len(s); i++ {
|
for i := 0; i < len(s); i++ {
|
||||||
if 64 < s[i] && s[i] < 91 {
|
if 64 < s[i] && s[i] < 91 {
|
||||||
res = append(res, i)
|
result = append(result, i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(s) > 0 && res != nil && res[0] != 0 {
|
if len(s) > 0 && result != nil && result[0] != 0 {
|
||||||
res = append([]int{0}, res...)
|
result = append([]int{0}, result...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,3 +70,9 @@ func ExecCommand(command string) (stdout, stderr string, err error) {
|
|||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetOsBits get this system bits 32bit or 64bit
|
||||||
|
// return bit int (32/64)
|
||||||
|
func GetOsBits() int {
|
||||||
|
return 32 << (^uint(0) >> 63)
|
||||||
|
}
|
||||||
|
|||||||
@@ -60,3 +60,13 @@ func TestExecCommand(t *testing.T) {
|
|||||||
assert.IsNotNil(err)
|
assert.IsNotNil(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetOsBits(t *testing.T) {
|
||||||
|
osBits := GetOsBits()
|
||||||
|
switch osBits {
|
||||||
|
case 32, 64:
|
||||||
|
t.Logf("os is %d", osBits)
|
||||||
|
default:
|
||||||
|
t.Error("os is not 32 or 64 bits")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user