mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-07 14:12:28 +08:00
Compare commits
127 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a74038466f | ||
|
|
02daa7f6cb | ||
|
|
fef6fd7b9d | ||
|
|
f6cd98086f | ||
|
|
24eb2bbacd | ||
|
|
15c1537bf0 | ||
|
|
c02654559a | ||
|
|
634ca09e8c | ||
|
|
f2e743dcf4 | ||
|
|
f8f58cae10 | ||
|
|
215b79140d | ||
|
|
0bd675340f | ||
|
|
f3d73899b1 | ||
|
|
d4a20b239a | ||
|
|
4c28431451 | ||
|
|
168ed096c7 | ||
|
|
a060769635 | ||
|
|
0a99492cf6 | ||
|
|
fb3de03f37 | ||
|
|
43c2fd2a22 | ||
|
|
279d0754ba | ||
|
|
f133b32faa | ||
|
|
b98d5edbb5 | ||
|
|
9e39c31087 | ||
|
|
26bc40c614 | ||
|
|
76d68e326b | ||
|
|
67b4782ac2 | ||
|
|
1d8b9a2625 | ||
|
|
94ae1acc78 | ||
|
|
aece2995d6 | ||
|
|
f5ec5eb58d | ||
|
|
d62284e9a6 | ||
|
|
b6815224fd | ||
|
|
5931b882ee | ||
|
|
f8096e3585 | ||
|
|
979381bfb7 | ||
|
|
3e2c25f827 | ||
|
|
2c7bcc9fbb | ||
|
|
3a944ab12f | ||
|
|
387079d034 | ||
|
|
33e3631b72 | ||
|
|
b3149ea619 | ||
|
|
116ff284c3 | ||
|
|
0cb251f7b8 | ||
|
|
683def2242 | ||
|
|
d4a90f2869 | ||
|
|
be67de3b40 | ||
|
|
6898ed413e | ||
|
|
5dbdbcd651 | ||
|
|
ae0facd32d | ||
|
|
2d7e19fb87 | ||
|
|
24d4a03227 | ||
|
|
93fb089f6e | ||
|
|
2fe272f2ef | ||
|
|
77859ffa15 | ||
|
|
f83f47df3a | ||
|
|
885c08847d | ||
|
|
cc4a20751f | ||
|
|
b0d1d39452 | ||
|
|
02fa7bc8be | ||
|
|
433eb63b86 | ||
|
|
a2541dac03 | ||
|
|
690e746811 | ||
|
|
7cb97a26c5 | ||
|
|
39d373d37b | ||
|
|
1aefd6aa12 | ||
|
|
c7aa44b8a4 | ||
|
|
0e3dc68de5 | ||
|
|
4083e75ed4 | ||
|
|
1327eff62f | ||
|
|
eb24c37143 | ||
|
|
b7a6c91064 | ||
|
|
555e185871 | ||
|
|
cb0efc5cc7 | ||
|
|
7ac6816532 | ||
|
|
81c4216699 | ||
|
|
2e30389703 | ||
|
|
0e1d5cf04b | ||
|
|
4e2d84e4fc | ||
|
|
13ee045b99 | ||
|
|
f1fd4c876b | ||
|
|
cd63b2b18f | ||
|
|
bab9b4a6b3 | ||
|
|
b3c34578bf | ||
|
|
f26477904e | ||
|
|
85886cf618 | ||
|
|
a19a861552 | ||
|
|
96d57a6d24 | ||
|
|
b48155c249 | ||
|
|
41685022c0 | ||
|
|
4e7274ce05 | ||
|
|
2384b0e51f | ||
|
|
6b6b938d1e | ||
|
|
29d8987909 | ||
|
|
43fb3f1a06 | ||
|
|
34c28fece3 | ||
|
|
40c2402493 | ||
|
|
c965e79bfc | ||
|
|
eeadb1fecb | ||
|
|
1dd826f050 | ||
|
|
8b04aa5f31 | ||
|
|
6855fe0bce | ||
|
|
300be9e3dc | ||
|
|
384be2e2e9 | ||
|
|
1d71a0ad3a | ||
|
|
0e0ed316f1 | ||
|
|
961eedda04 | ||
|
|
f4881d2f49 | ||
|
|
a3eb269bdb | ||
|
|
e367123070 | ||
|
|
0f1d3fb553 | ||
|
|
a4658b2341 | ||
|
|
739113ef9e | ||
|
|
1629b861cd | ||
|
|
acce85557f | ||
|
|
05aefbaa62 | ||
|
|
6988fdc451 | ||
|
|
5963830879 | ||
|
|
134aded4d8 | ||
|
|
35780d9dc1 | ||
|
|
c40ac9bb9b | ||
|
|
51bd974cc9 | ||
|
|
0b93fbffd9 | ||
|
|
349f8b6c97 | ||
|
|
5899921054 | ||
|
|
ec19014578 | ||
|
|
1ad990ce9d |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -6,4 +6,5 @@ fileutil/*.txt
|
|||||||
fileutil/*.zip
|
fileutil/*.zip
|
||||||
fileutil/*.link
|
fileutil/*.link
|
||||||
fileutil/unzip/*
|
fileutil/unzip/*
|
||||||
|
slice/testdata/*
|
||||||
cryptor/*.pem
|
cryptor/*.pem
|
||||||
809
README.md
809
README.md
@@ -1,26 +1,32 @@
|
|||||||
# Lancet
|
<div align=center>
|
||||||
<p style="font-size: 18px">
|
<img src="./logo.png" width="200" height="200"/>
|
||||||
Lancet is a comprehensive, efficient, and reusable util function library of go. Inspired by the java apache common package and lodash.js.
|
|
||||||
</p>
|
|
||||||
|
|
||||||

|
<br/>
|
||||||
[](https://github.com/duke-git/lancet/releases)
|
|
||||||
|

|
||||||
|
[](https://github.com/duke-git/lancet/releases)
|
||||||
[](https://pkg.go.dev/github.com/duke-git/lancet)
|
[](https://pkg.go.dev/github.com/duke-git/lancet)
|
||||||
[](https://goreportcard.com/report/github.com/duke-git/lancet)
|
[](https://goreportcard.com/report/github.com/duke-git/lancet)
|
||||||
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
|
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
|
||||||
[](https://codecov.io/gh/duke-git/lancet)
|
[](https://codecov.io/gh/duke-git/lancet)
|
||||||
[](https://github.com/duke-git/lancet/blob/main/LICENSE)
|
[](https://github.com/duke-git/lancet/blob/v1/LICENSE)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
<p style="font-size: 20px">
|
||||||
|
Lancet is a comprehensive, efficient, and reusable util function library of go. Inspired by the java apache common package and lodash.js.
|
||||||
|
</p>
|
||||||
|
|
||||||
English | [简体中文](./README_zh-CN.md)
|
English | [简体中文](./README_zh-CN.md)
|
||||||
|
|
||||||
|
|
||||||
## Feature
|
## Feature
|
||||||
|
|
||||||
- 👏 Comprehensive, efficient and reusable.
|
- 👏 Comprehensive, efficient and reusable.
|
||||||
- 💪 160+ common go util functions, support string, slice, datetime, net, crypt...
|
- 💪 200+ go util functions, support string, slice, datetime, net, crypt...
|
||||||
- 💅 Only depend on the go standard library.
|
- 💅 Only depend on the go standard library.
|
||||||
- 🌍 Unit test for every exported function.
|
- 🌍 Unit test for every exported function.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -38,7 +44,7 @@ import "github.com/duke-git/lancet/strutil"
|
|||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
Here takes the string function ReverseStr (reverse order string) as an example, and the strutil package needs to be imported.
|
Here takes the string function Reverse (reverse order string) as an example, and the strutil package needs to be imported.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
@@ -50,547 +56,380 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := "hello"
|
s := "hello"
|
||||||
rs := strutil.ReverseStr(s)
|
rs := strutil.Reverse(s)
|
||||||
fmt.Println(rs) //olleh
|
fmt.Println(rs) //olleh
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## API Documentation
|
## API Documentation
|
||||||
### 1. convertor contains some functions for data convertion
|
|
||||||
|
|
||||||
- Support conversion between commonly used data types.
|
### 1. Convertor package contains some functions for data convertion.
|
||||||
- Usage: import "github.com/duke-git/lancet/convertor"
|
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/convertor"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/convertor"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
s := "12.3"
|
|
||||||
f, err := convertor.ToFloat(s)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Errorf("error is %s", err.Error())
|
|
||||||
}
|
|
||||||
fmt.Println(f) // 12.3
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Function list:
|
#### Function list:
|
||||||
|
|
||||||
|
- [ColorHexToRGB](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ColorHexToRGB)
|
||||||
|
- [ColorRGBToHex](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ColorRGBToHex)
|
||||||
|
- [ToBool](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToBool)
|
||||||
|
- [ToBytes](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToBytes)
|
||||||
|
- [ToChar](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToChar)
|
||||||
|
- [ToChannel](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToChannel)
|
||||||
|
- [ToInt](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToInt)
|
||||||
|
- [ToJson](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToJson)
|
||||||
|
- [ToString](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToString)
|
||||||
|
- [StructToMap](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#StructToMap)
|
||||||
|
- [EncodeByte](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#EncodeByte)
|
||||||
|
- [DecodeByte](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#DecodeByte)
|
||||||
|
- [DeepClone](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#DeepClone)
|
||||||
|
- [CopyProperties](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#CopyProperties)
|
||||||
|
|
||||||
|
### 2. Cryptor package is for data encryption and decryption.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ColorHexToRGB(colorHex string) (red, green, blue int) //convert color hex to color rgb
|
import "github.com/duke-git/lancet/cryptor"
|
||||||
func ColorRGBToHex(red, green, blue int) string //convert color rgb to color hex
|
|
||||||
func ToBool(s string) (bool, error) //convert string to a boolean
|
|
||||||
func ToBytes(data interface{}) ([]byte, error) //convert interface to bytes
|
|
||||||
func ToChar(s string) []string //convert string to char slice
|
|
||||||
func ToFloat(value interface{}) (float64, error) //convert value to float64, if input is not a float return 0.0 and error
|
|
||||||
func ToInt(value interface{}) (int64, error) //convert value to int64, if input is not a numeric format return 0 and error
|
|
||||||
func ToJson(value interface{}) (string, error) //convert value to a valid json string
|
|
||||||
func ToString(value interface{}) string //convert value to string
|
|
||||||
func StructToMap(value interface{}) (map[string]interface{}, error) //convert struct to map, only convert exported field, tag `json` should be set
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. cryptor is for data encryption and decryption
|
#### Function list:
|
||||||
|
|
||||||
- Support md5, hmac, aes, des, ras.
|
- [AesEcbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesEcbEncrypt)
|
||||||
- Usage: import "github.com/duke-git/lancet/cryptor"
|
- [AesEcbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesEcbDecrypt)
|
||||||
|
- [AesCbcEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesCbcEncrypt)
|
||||||
|
- [AesCbcDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesCbcDecrypt)
|
||||||
|
- [AesCtrCrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesCtrCrypt)
|
||||||
|
- [AesCfbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesCfbEncrypt)
|
||||||
|
- [AesCfbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesCfbDecrypt)
|
||||||
|
- [AesOfbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesOfbEncrypt)
|
||||||
|
- [AesOfbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#AesOfbDecrypt)
|
||||||
|
- [Base64StdEncode](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#Base64StdEncode)
|
||||||
|
- [Base64StdDecode](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#Base64StdDecode)
|
||||||
|
- [DesEcbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesEcbEncrypt)
|
||||||
|
- [DesEcbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesEcbDecrypt)
|
||||||
|
- [DesCbcEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesCbcEncrypt)
|
||||||
|
- [DesCbcDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesCbcDecrypt)
|
||||||
|
- [DesCtrCrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesCtrCrypt)
|
||||||
|
- [DesCfbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesCfbEncrypt)
|
||||||
|
- [DesCfbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesCfbDecrypt)
|
||||||
|
- [DesOfbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesOfbEncrypt)
|
||||||
|
- [DesOfbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#DesOfbDecrypt)
|
||||||
|
- [HmacMd5](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#HmacMd5)
|
||||||
|
- [HmacSha1](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#HmacSha1)
|
||||||
|
- [HmacSha256](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#HmacSha256)
|
||||||
|
- [HmacSha512](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#HmacSha512)
|
||||||
|
- [Md5String](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#Md5String)
|
||||||
|
- [Md5File](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#Md5File)
|
||||||
|
- [Sha1](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#Sha1)
|
||||||
|
- [Sha256](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#Sha256)
|
||||||
|
- [Sha512](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#Sha512)
|
||||||
|
- [GenerateRsaKey](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#GenerateRsaKey)
|
||||||
|
- [RsaEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#RsaEncrypt)
|
||||||
|
- [RsaDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor.md#RsaDecrypt)
|
||||||
|
|
||||||
|
### 3. Datetime package supports date and time format and compare.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/datetime"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/cryptor"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
data := "hello"
|
|
||||||
key := "abcdefghijklmnop"
|
|
||||||
|
|
||||||
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
|
||||||
decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
|
|
||||||
fmt.Println(string(decrypted)) // hello
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Function list:
|
#### Function list:
|
||||||
|
|
||||||
|
- [AddDay](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#AddDay)
|
||||||
|
- [AddHour](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#AddHour)
|
||||||
|
- [AddMinute](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#AddMinute)
|
||||||
|
- [BeginOfMinute](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfMinute)
|
||||||
|
- [BeginOfHour](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfHour)
|
||||||
|
- [BeginOfDay](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfDay)
|
||||||
|
- [BeginOfWeek](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfWeek)
|
||||||
|
- [BeginOfMonth](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfMonth)
|
||||||
|
- [BeginOfYear](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfYear)
|
||||||
|
- [EndOfMinute](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfMinute)
|
||||||
|
- [EndOfHour](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfHour)
|
||||||
|
- [EndOfDay](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfDay)
|
||||||
|
- [EndOfWeek](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfWeek)
|
||||||
|
- [EndOfMonth](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfMonth)
|
||||||
|
- [EndOfYear](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfYear)
|
||||||
|
- [GetNowDate](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#GetNowDate)
|
||||||
|
- [GetNowTime](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#GetNowTime)
|
||||||
|
- [GetNowDateTime](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#GetNowDateTime)
|
||||||
|
- [GetZeroHourTimestamp](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#GetZeroHourTimestamp)
|
||||||
|
- [GetNightTimestamp](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#GetNightTimestamp)
|
||||||
|
- [FormatTimeToStr](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#FormatTimeToStr)
|
||||||
|
- [FormatStrToTime](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#FormatStrToTime)
|
||||||
|
- [NewUnix](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#NewUnix)
|
||||||
|
- [NewUnixNow](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#NewUnixNow)
|
||||||
|
- [NewFormat](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#NewFormat)
|
||||||
|
- [NewISO8601](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#NewISO8601)
|
||||||
|
- [ToUnix](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#ToUnix)
|
||||||
|
- [ToFormat](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#ToFormat)
|
||||||
|
- [ToFormatForTpl](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#ToFormatForTpl)
|
||||||
|
- [ToIso8601](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#ToIso8601)
|
||||||
|
|
||||||
|
### 4. Fileutil package implements some basic functions for file operations.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func AesEcbEncrypt(data, key []byte) []byte //AES ECB encrypt
|
import "github.com/duke-git/lancet/fileutil"
|
||||||
func AesEcbDecrypt(encrypted, key []byte) []byte //AES ECB decrypt
|
|
||||||
func AesCbcEncrypt(data, key []byte) []byte //AES CBC encrypt
|
|
||||||
func AesCbcDecrypt(encrypted, key []byte) []byte //AES CBC decrypt
|
|
||||||
func AesCtrCrypt(data, key []byte) []byte //AES CTR encrypt / decrypt
|
|
||||||
func AesCfbEncrypt(data, key []byte) []byte //AES CFB encrypt
|
|
||||||
func AesCfbDecrypt(encrypted, key []byte) []byte //AES CFB decrypt
|
|
||||||
func AesOfbEncrypt(data, key []byte) []byte //AES OFB encrypt
|
|
||||||
func AesOfbDecrypt(data, key []byte) []byte //AES OFB decrypt
|
|
||||||
func Base64StdEncode(s string) string //base64 encode
|
|
||||||
func Base64StdDecode(s string) string //base64 decode
|
|
||||||
func DesCbcEncrypt(data, key []byte) []byte //DES CBC encrypt
|
|
||||||
func DesCbcDecrypt(encrypted, key []byte) []byte //DES CBC decrypt
|
|
||||||
func DesCtrCrypt(data, key []byte) []byte //DES CTR encrypt/decrypt
|
|
||||||
func DesCfbEncrypt(data, key []byte) []byte //DES CFB encrypt
|
|
||||||
func DesCfbDecrypt(encrypted, key []byte) []byte //DES CFB decrypt
|
|
||||||
func DesOfbEncrypt(data, key []byte) []byte //DES OFB encrypt
|
|
||||||
func DesOfbDecrypt(data, key []byte) []byte //DES OFB decrypt
|
|
||||||
func HmacMd5(data, key string) string //get hmac md5 value
|
|
||||||
func HmacSha1(data, key string) string //get hmac sha1 value
|
|
||||||
func HmacSha256(data, key string) string //get hmac sha256 value
|
|
||||||
func HmacSha512(data, key string) string //get hmac sha512 value
|
|
||||||
func Md5String(s string) string //return the md5 value of string
|
|
||||||
func Md5File(filename string) (string, error) //return the md5 value of file
|
|
||||||
func Sha1(data string) string //get sha1 value
|
|
||||||
func Sha256(data string) string //getsha256 value
|
|
||||||
func Sha512(data string) string //get sha512 value
|
|
||||||
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) //generate RSA pem file
|
|
||||||
func RsaEncrypt(data []byte, pubKeyFileName string) []byte //RSA encrypt
|
|
||||||
func RsaDecrypt(data []byte, privateKeyFileName string) []byte //RSA decrypt
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. datetime parse and format datetime
|
#### Function list:
|
||||||
|
|
||||||
- Parse and format datetime
|
- [ClearFile](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#ClearFile)
|
||||||
- Usage: import "github.com/duke-git/lancet/datetime"
|
- [CreateFile](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#CreateFile)
|
||||||
|
- [CreateDir](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#CreateDir)
|
||||||
|
- [CopyFile](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#CopyFile)
|
||||||
|
- [FileMode](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#FileMode)
|
||||||
|
- [MiMeType](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#MiMeType)
|
||||||
|
- [IsExist](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#IsExist)
|
||||||
|
- [IsLink](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#IsLink)
|
||||||
|
- [IsDir](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#IsDir)
|
||||||
|
- [ListFileNames](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#ListFileNames)
|
||||||
|
- [RemoveFile](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#RemoveFile)
|
||||||
|
- [ReadFileToString](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#ReadFileToString)
|
||||||
|
- [ReadFileByLine](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#ReadFileByLine)
|
||||||
|
- [Zip](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#Zip)
|
||||||
|
- [UnZip](https://github.com/duke-git/lancet/blob/v1/docs/fileutil.md#UnZip)
|
||||||
|
|
||||||
|
### 5. Formatter contains some functions for data formatting.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/formatter"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/datetime"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
now := time.Now()
|
|
||||||
s := datetime.FormatTimeToStr(now, "yyyy-mm-dd hh:mm:ss")
|
|
||||||
fmt.Println(s) // 2021-11-24 11:16:55
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Function list:
|
#### Function list:
|
||||||
|
|
||||||
|
- [Comma](https://github.com/duke-git/lancet/blob/v1/docs/formatter.md#Comma)
|
||||||
|
|
||||||
|
### Function package can control the flow of function execution and support part of functional programming
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func AddDay(t time.Time, day int64) time.Time //add or sub days to time
|
import "github.com/duke-git/lancet/function"
|
||||||
func AddHour(t time.Time, hour int64) time.Time //add or sub hours to time
|
|
||||||
func AddMinute(t time.Time, minute int64) time.Time //add or sub minutes to time
|
|
||||||
func GetNowDate() string //get current date, format is yyyy-mm-dd
|
|
||||||
func GetNowTime() string //get current time, format is hh:mm:ss
|
|
||||||
func GetNowDateTime() string //get current date and time, format is yyyy-mm-dd hh:mm:ss
|
|
||||||
func GetZeroHourTimestamp() int64 //return timestamp of zero hour (timestamp of 00:00)
|
|
||||||
func GetNightTimestamp() int64 //return timestamp of zero hour (timestamp of 23:59)
|
|
||||||
func FormatTimeToStr(t time.Time, format string) string //convert time to string
|
|
||||||
func FormatStrToTime(str, format string) time.Time //convert string to time
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. fileutil basic functions for file operations
|
#### Function list:
|
||||||
|
|
||||||
- Basic functions for file operations.
|
- [After](https://github.com/duke-git/lancet/blob/v1/docs/function.md#After)
|
||||||
- Usage: import "github.com/duke-git/lancet/fileutil"
|
- [Before](https://github.com/duke-git/lancet/blob/v1/docs/function.md#Before)
|
||||||
|
- [Curry](https://github.com/duke-git/lancet/blob/v1/docs/function.md#Curry)
|
||||||
|
- [Compose](https://github.com/duke-git/lancet/blob/v1/docs/function.md#Compose)
|
||||||
|
- [Debounced](https://github.com/duke-git/lancet/blob/v1/docs/function.md#Debounced)
|
||||||
|
- [Delay](https://github.com/duke-git/lancet/blob/v1/docs/function.md#Delay)
|
||||||
|
- [Pipeline](https://github.com/duke-git/lancet/blob/v1/docs/function.md#Pipeline)
|
||||||
|
- [Schedule](https://github.com/duke-git/lancet/blob/v1/docs/function.md#Schedule)
|
||||||
|
- [Watcher](https://github.com/duke-git/lancet/blob/v1/docs/function.md#Watcher)
|
||||||
|
|
||||||
|
### 6. Mathutil package implements some functions for math calculation.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/mathutil"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/fileutil"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Println(fileutil.IsDir("./")) // true
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Function list:
|
#### Function list:
|
||||||
|
|
||||||
|
- [Exponent](https://github.com/duke-git/lancet/blob/v1/docs/mathutil.md#Exponent)
|
||||||
|
- [Fibonacci](https://github.com/duke-git/lancet/blob/v1/docs/mathutil.md#Fibonacci)
|
||||||
|
- [Factorial](https://github.com/duke-git/lancet/blob/v1/docs/mathutil.md#Factorial)
|
||||||
|
- [Percent](https://github.com/duke-git/lancet/blob/v1/docs/mathutil.md#Percent)
|
||||||
|
- [RoundToFloat](https://github.com/duke-git/lancet/blob/v1/docs/mathutil.md#RoundToFloat)
|
||||||
|
- [RoundToString](https://github.com/duke-git/lancet/blob/v1/docs/mathutil.md#RoundToString)
|
||||||
|
- [TruncRound](https://github.com/duke-git/lancet/blob/v1/docs/mathutil.md#TruncRound)
|
||||||
|
|
||||||
|
### 7. Netutil package contains functions to get net information and send http request.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ClearFile(path string) error //write empty string to path file
|
import "github.com/duke-git/lancet/netutil"
|
||||||
func CreateFile(path string) bool // create a file in path
|
|
||||||
func CopyFile(srcFilePath string, dstFilePath string) error //copy src file to dst file
|
|
||||||
func FileMode(path string) (fs.FileMode, error) //return file's mode and permission
|
|
||||||
func MiMeType(file interface{}) string //return file mime type, file should be string or *os.File
|
|
||||||
func IsExist(path string) bool //checks if a file or directory exists
|
|
||||||
func IsLink(path string) bool //checks if a file is symbol link or not
|
|
||||||
func IsDir(path string) bool //checks if the path is directy or not
|
|
||||||
func ListFileNames(path string) ([]string, error) //return all file names in the path
|
|
||||||
func RemoveFile(path string) error //remove the path file
|
|
||||||
func ReadFileToString(path string) (string, error) //return string of file content
|
|
||||||
func ReadFileByLine(path string)([]string, error) //read file content by line
|
|
||||||
func Zip(fpath string, destPath string) error //create zip file, fpath could be a single file or a directory
|
|
||||||
func UnZip(zipFile string, destPath string) error //unzip the file and save it to destPath
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. formatter is for data format
|
#### Function list:
|
||||||
|
|
||||||
- Contain some formatting function
|
- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#ConvertMapToQueryString)
|
||||||
- Usage: import "github.com/duke-git/lancet/formatter"
|
- [EncodeUrl](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#EncodeUrl)
|
||||||
|
- [GetInternalIp](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#GetInternalIp)
|
||||||
|
- [GetIps](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#GetIps)
|
||||||
|
- [GetMacAddrs](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#GetMacAddrs)
|
||||||
|
- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#GetPublicIpInfo)
|
||||||
|
- [GetRequestPublicIp](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#GetRequestPublicIp)
|
||||||
|
- [IsPublicIP](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#IsPublicIP)
|
||||||
|
- [IsInternalIP](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#IsInternalIP)
|
||||||
|
- [HttpGet](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#HttpGet)
|
||||||
|
- [HttpDelete](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#HttpDelete)
|
||||||
|
- [HttpPost](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#HttpPost)
|
||||||
|
- [HttpPut](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#HttpPut)
|
||||||
|
- [HttpPatch](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#HttpPatch)
|
||||||
|
- [ParseHttpResponse](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#ParseHttpResponse)
|
||||||
|
|
||||||
|
### 8. Random package implements some basic functions to generate random int and string.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/random"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/formatter"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Println(formatter.Comma("12345", "")) // "12,345"
|
|
||||||
fmt.Println(formatter.Comma(12345.67, "¥")) // "¥12,345.67"
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Function list:
|
#### Function list:
|
||||||
|
|
||||||
|
- [RandBytes](https://github.com/duke-git/lancet/blob/v1/docs/random.md#RandBytes)
|
||||||
|
- [RandInt](https://github.com/duke-git/lancet/blob/v1/docs/random.md#RandInt)
|
||||||
|
- [RandString](https://github.com/duke-git/lancet/blob/v1/docs/random.md#RandString)
|
||||||
|
- [RandUpper](https://github.com/duke-git/lancet/blob/v1/docs/random.md#RandUpper)
|
||||||
|
- [RandLower](https://github.com/duke-git/lancet/blob/v1/docs/random.md#RandLower)
|
||||||
|
- [RandNumeral](https://github.com/duke-git/lancet/blob/v1/docs/random.md#RandNumeral)
|
||||||
|
- [RandNumeralOrLetter](https://github.com/duke-git/lancet/blob/v1/docs/random.md#RandNumeralOrLetter)
|
||||||
|
- [UUIdV4](https://github.com/duke-git/lancet/blob/v1/docs/random.md#UUIdV4)
|
||||||
|
|
||||||
|
### 9. Retry package is for executing a function repeatedly until it was successful or canceled by the context.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Comma(v interface{}, symbol string) string //add comma to number by every 3 numbers from right. ahead by symbol char
|
import "github.com/duke-git/lancet/retry"
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6. function can control the function execution and support functional programming
|
#### Function list:
|
||||||
|
|
||||||
- Control function execution and support functional programming.
|
- [Context](https://github.com/duke-git/lancet/blob/v1/docs/retry.md#Context)
|
||||||
- Usage: import "github.com/duke-git/lancet/function"
|
- [Retry](https://github.com/duke-git/lancet/blob/v1/docs/retry.md#Retry)
|
||||||
|
- [RetryFunc](https://github.com/duke-git/lancet/blob/v1/docs/retry.md#RetryFunc)
|
||||||
|
- [RetryDuration](https://github.com/duke-git/lancet/blob/v1/docs/retry.md#RetryDuration)
|
||||||
|
- [RetryTimes](https://github.com/duke-git/lancet/blob/v1/docs/retry.md#RetryTimes)
|
||||||
|
|
||||||
|
### 10. Slice contains some functions to manipulate slice.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/slice"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/function"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var print = func(s string) {
|
|
||||||
fmt.Println(s)
|
|
||||||
}
|
|
||||||
function.Delay(2*time.Second, print, "hello world")
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Function list:
|
#### Function list:
|
||||||
|
|
||||||
|
- [AppendIfAbsent](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#AppendIfAbsent)
|
||||||
|
- [Contain](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Contain)
|
||||||
|
- [ContainSubSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#ContainSubSlice)
|
||||||
|
- [Chunk](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Chunk)
|
||||||
|
- [Compact](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Compact)
|
||||||
|
- [Concat](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Concat)
|
||||||
|
- [Count](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Count)
|
||||||
|
- [Difference](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Difference)
|
||||||
|
- [DifferenceBy](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#DifferenceBy)
|
||||||
|
- [DeleteByIndex](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#DeleteByIndex)
|
||||||
|
- [Drop](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Drop)
|
||||||
|
- [Every](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Every)
|
||||||
|
- [Equal](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Equal)
|
||||||
|
- [EqualWith](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#EqualWith)
|
||||||
|
- [Filter](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Filter)
|
||||||
|
- [Find](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Find)
|
||||||
|
- [FindLast](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#FindLast)
|
||||||
|
- [FlattenDeep](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#FlattenDeep)
|
||||||
|
- [ForEach](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#ForEach)
|
||||||
|
- [GroupBy](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#GroupBy)
|
||||||
|
- [IntSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#IntSlice)
|
||||||
|
- [IndexOf](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#IndexOf)
|
||||||
|
- [LastIndexOf](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#LastIndexOf)
|
||||||
|
- [InterfaceSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#InterfaceSlice)
|
||||||
|
- [Intersection](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Intersection)
|
||||||
|
- [InsertByIndex](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#InsertByIndex)
|
||||||
|
- [Map](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Map)
|
||||||
|
- [ReverseSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#ReverseSlice)
|
||||||
|
- [Reduce](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Reduce)
|
||||||
|
- [Shuffle](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Shuffle)
|
||||||
|
- [SortByField](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#SortByField)
|
||||||
|
- [Some](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Some)
|
||||||
|
- [StringSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#StringSlice)
|
||||||
|
- [ToSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#ToSlice)
|
||||||
|
- [ToSlicePointer](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#ToSlice)
|
||||||
|
- [Unique](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Unique)
|
||||||
|
- [UniqueBy](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#UniqueBy)
|
||||||
|
- [Union](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Union)
|
||||||
|
- [UpdateByIndex](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#UpdateByIndex)
|
||||||
|
- [Without](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#Without)
|
||||||
|
|
||||||
|
### 11. Strutil package contains some functions to manipulate string.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func After(n int, fn interface{}) func(args ...interface{}) []reflect.Value //creates a function that invokes func once it's called n or more times
|
import "github.com/duke-git/lancet/strutil"
|
||||||
func Before(n int, fn interface{}) func(args ...interface{}) []reflect.Value //creates a function that invokes func once it's called less than n times
|
|
||||||
func (f Fn) Curry(i interface{}) func(...interface{}) interface{} //make a curryed function
|
|
||||||
func Compose(fnList ...func(...interface{}) interface{}) func(...interface{}) interface{} //compose the functions from right to left
|
|
||||||
func Debounced(fn func(), duration time.Duration) func() //creates a debounced function that delays invoking fn until after wait duration have elapsed since the last time the debounced function was invoked.
|
|
||||||
func Delay(delay time.Duration, fn interface{}, args ...interface{}) //invoke function after delayed time
|
|
||||||
func Schedule(d time.Duration, fn interface{}, args ...interface{}) chan bool //invoke function every duration time, util close the returned bool chan
|
|
||||||
func (w *Watcher) Start() //start the watch timer.
|
|
||||||
func (w *Watcher) Stop() //stop the watch timer
|
|
||||||
func (w *Watcher) Reset() {} //reset the watch timer.
|
|
||||||
func (w *Watcher) GetElapsedTime() time.Duration //return time duration from watcher start to end.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 7. netutil is for net process
|
#### Function list:
|
||||||
|
|
||||||
- Ip and http request method.
|
- [After](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#After)
|
||||||
- Usage: import "github.com/duke-git/lancet/netutil".
|
- [AfterLast](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#AfterLast)
|
||||||
- The Http function params order:url, header, query string, body, httpclient.
|
- [Before](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#Before)
|
||||||
|
- [BeforeLast](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#BeforeLast)
|
||||||
|
- [CamelCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#CamelCase)
|
||||||
|
- [Capitalize](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#Capitalize)
|
||||||
|
- [IsString](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#IsString)
|
||||||
|
- [KebabCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#KebabCase)
|
||||||
|
- [UpperKebabCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#UpperKebabCase)
|
||||||
|
- [LowerFirst](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#LowerFirst)
|
||||||
|
- [UpperFirst](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#UpperFirst)
|
||||||
|
- [Pad](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#Pad)
|
||||||
|
- [PadEnd](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#PadEnd)
|
||||||
|
- [PadStart](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#PadStart)
|
||||||
|
- [Reverse](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#Reverse)
|
||||||
|
- [SnakeCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#SnakeCase)
|
||||||
|
- [UpperSnakeCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#UpperSnakeCase)
|
||||||
|
- [SplitEx](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#SplitEx)
|
||||||
|
- [Wrap](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#Wrap)
|
||||||
|
- [Unwrap](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#Unwrap)
|
||||||
|
- [SplitWords](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#SplitWords)
|
||||||
|
- [WordCount](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#WordCount)
|
||||||
|
|
||||||
|
### 12. System package contain some functions about os, runtime, shell command.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/system"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/netutil"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
url := "https://gutendex.com/books?"
|
|
||||||
header := make(map[string]string)
|
|
||||||
header["Content-Type"] = "application/json"
|
|
||||||
queryParams := make(map[string]interface{})
|
|
||||||
queryParams["ids"] = "1"
|
|
||||||
|
|
||||||
resp, err := netutil.HttpGet(url, header, queryParams)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
body, _ := ioutil.ReadAll(resp.Body)
|
|
||||||
fmt.Println("response: ", resp.StatusCode, string(body))
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Function list:
|
#### Function list:
|
||||||
|
|
||||||
|
- [IsWindows](https://github.com/duke-git/lancet/blob/v1/docs/system.md#IsWindows)
|
||||||
|
- [IsLinux](https://github.com/duke-git/lancet/blob/v1/docs/system.md#IsLinux)
|
||||||
|
- [IsMac](https://github.com/duke-git/lancet/blob/v1/docs/system.md#IsMac)
|
||||||
|
- [GetOsEnv](https://github.com/duke-git/lancet/blob/v1/docs/system.md#GetOsEnv)
|
||||||
|
- [SetOsEnv](https://github.com/duke-git/lancet/blob/v1/docs/system.md#SetOsEnv)
|
||||||
|
- [RemoveOsEnv](https://github.com/duke-git/lancet/blob/v1/docs/system.md#RemoveOsEnv)
|
||||||
|
- [CompareOsEnv](https://github.com/duke-git/lancet/blob/v1/docs/system.md#CompareOsEnv)
|
||||||
|
- [ExecCommand](https://github.com/duke-git/lancet/blob/v1/docs/system.md#ExecCommand)
|
||||||
|
- [GetOsBits](https://github.com/duke-git/lancet/blob/v1/docs/system.md#GetOsBits)
|
||||||
|
|
||||||
|
### 13. Validator package contains some functions for data validation.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func GetInternalIp() string //get internal ip
|
import "github.com/duke-git/lancet/validator"
|
||||||
func GetPublicIpInfo() (*PublicIpInfo, error) //get public ip info: country, region, isp, city, lat, lon, ip
|
|
||||||
func IsPublicIP(IP net.IP) bool //判断ip是否为公共ip
|
|
||||||
func HttpGet(url string, params ...interface{}) (*http.Response, error) //http get request
|
|
||||||
func HttpPost(url string, params ...interface{}) (*http.Response, error) //http post request
|
|
||||||
func HttpPut(url string, params ...interface{}) (*http.Response, error) //http put request
|
|
||||||
func HttpDelete(url string, params ...interface{}) (*http.Response, error) //http delete request
|
|
||||||
func HttpPatch(url string, params ...interface{}) (*http.Response, error) //http patch request
|
|
||||||
func ConvertMapToQueryString(param map[string]interface{}) string //convert map to url query string
|
|
||||||
func ParseHttpResponse(resp *http.Response, obj interface{}) error //decode http response to specified interface
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8. random is for rand string and int generation
|
#### Function list:
|
||||||
|
|
||||||
- Generate random string and int.
|
- [ContainChinese](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#ContainChinese)
|
||||||
- Usage: import "github.com/duke-git/lancet/random".
|
- [ContainLetter](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#ContainLetter)
|
||||||
|
- [ContainLower](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#ContainLower)
|
||||||
|
- [ContainUpper](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#ContainUpper)
|
||||||
|
- [IsAlpha](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsAlpha)
|
||||||
|
- [IsAllUpper](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsAllUpper)
|
||||||
|
- [IsAllLower](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsAllLower)
|
||||||
|
- [IsBase64](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsBase64)
|
||||||
|
- [IsChineseMobile](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsChineseMobile)
|
||||||
|
- [IsChineseIdNum](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsChineseIdNum)
|
||||||
|
- [IsChinesePhone](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsChinesePhone)
|
||||||
|
- [IsCreditCard](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsCreditCard)
|
||||||
|
- [IsDns](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsDns)
|
||||||
|
- [IsEmail](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsEmail)
|
||||||
|
- [IsEmptyString](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsEmptyString)
|
||||||
|
- [IsFloatStr](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsFloatStr)
|
||||||
|
- [IsNumberStr](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsNumberStr)
|
||||||
|
- [IsJSON](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsJSON)
|
||||||
|
- [IsRegexMatch](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsRegexMatch)
|
||||||
|
- [IsIntStr](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsIntStr)
|
||||||
|
- [IsIp](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsIp)
|
||||||
|
- [IsIpV4](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsIpV4)
|
||||||
|
- [IsIpV6](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsIpV6)
|
||||||
|
- [IsStrongPassword](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsStrongPassword)
|
||||||
|
- [IsUrl](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsUrl)
|
||||||
|
- [IsWeakPassword](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsWeakPassword)
|
||||||
|
- [IsZeroValue](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsZeroValue)
|
||||||
|
- [IsGBK](https://github.com/duke-git/lancet/blob/v1/docs/validator.md#IsGBK)
|
||||||
|
|
||||||
```go
|
## How to Contribute
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
I really appreciate any code commits which make lancet lib powerful. Please follow the rules below to create your pull request.
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/random"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
1. Fork the repository.
|
||||||
randStr := random.RandString(6)
|
2. Create your feature branch.
|
||||||
fmt.Println(randStr)
|
3. Commit your changes.
|
||||||
}
|
4. Push to the branch
|
||||||
```
|
5. Create new pull request.
|
||||||
|
|
||||||
- Function list:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func RandBytes(length int) []byte //generate random []byte
|
|
||||||
func RandInt(min, max int) int //generate random int
|
|
||||||
func RandString(length int) string //generate random string
|
|
||||||
```
|
|
||||||
|
|
||||||
### 9. retry is for executing a function repeatedly until it was successful or canceled by the context.
|
|
||||||
|
|
||||||
- Executes a function repeatedly until it was successful or canceled by the context.
|
|
||||||
- Default retry times is 5, default retry duration is 3 second.
|
|
||||||
- Usage: import "github.com/duke-git/lancet/retry".
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/retry"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var number int
|
|
||||||
increaseNumber := func() error {
|
|
||||||
number++
|
|
||||||
if number == 3 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.New("error occurs")
|
|
||||||
}
|
|
||||||
|
|
||||||
err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50))
|
|
||||||
|
|
||||||
fmt.Println(number) //3
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- Function list:
|
|
||||||
|
|
||||||
```go
|
|
||||||
type RetryFunc func() error //function that retry executes
|
|
||||||
func RetryTimes(n uint) //set times of retry
|
|
||||||
func RetryDuration(d time.Duration) //generate random string
|
|
||||||
func Context(ctx context.Context) //set retry context config
|
|
||||||
func Retry(retryFunc RetryFunc, opts ...Option) error //executes the retryFunc repeatedly until it was successful or canceled by the context
|
|
||||||
```
|
|
||||||
|
|
||||||
### 10. slice is for process slice
|
|
||||||
|
|
||||||
- Contain function for process slice.
|
|
||||||
- Usage: import "github.com/duke-git/lancet/slice"
|
|
||||||
- Due to the unstable support of generic, most of the slice processing function parameter and return value is interface {}. After go generic is stable, the related functions will be refactored.
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/slice"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
nums := []int{1, 4, 3, 4, 6, 7, 3}
|
|
||||||
uniqueNums, _ := slice.IntSlice(slice.Unique(nums))
|
|
||||||
fmt.Println(uniqueNums) //[1 4 3 6 7]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- Function list:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func Contain(slice interface{}, value interface{}) bool //check if the value is in the slice or not
|
|
||||||
func ContainSubSlice(slice interface{}, subslice interface{}) bool //check if the slice contain subslice or not
|
|
||||||
func Chunk(slice []interface{}, size int) [][]interface{} //creates an slice of elements split into groups the length of `size`
|
|
||||||
func Compact(slice interface{}) interface{} //creates an slice with all falsey values removed. The values false, nil, 0, and "" are falsey
|
|
||||||
func Concat(slice interface{}, values ...interface{}) interface{} //creates a new slice concatenating slice with any additional slices and/or values
|
|
||||||
func Difference(slice1, slice2 interface{}) interface{} //creates an slice of whose element not included in the other given slice
|
|
||||||
func DifferenceBy(slice interface{}, comparedSlice interface{}, iterateeFn interface{}) interface{} //it accepts iteratee which is invoked for each element of slice and values to generate the criterion by which they're compared.
|
|
||||||
func DeleteByIndex(slice interface{}, start int, end ...int) (interface{}, error) //delete the element of slice from start index to end index - 1
|
|
||||||
func Drop(slice interface{}, n int) interface{} //creates a slice with `n` elements dropped from the beginning when n > 0, or `n` elements dropped from the ending when n < 0
|
|
||||||
func Every(slice, function interface{}) bool //return true if all of the values in the slice pass the predicate function, function signature should be func(index int, value interface{}) bool
|
|
||||||
func None(slice, function interface{}) bool // return true if all the values in the slice mismatch the criteria
|
|
||||||
func Filter(slice, function interface{}) interface{} //filter slice, function signature should be func(index int, value interface{}) bool
|
|
||||||
func Find(slice, function interface{}) (interface{}, bool) //iterates over elements of slice, returning the first one that passes a truth test on function.function signature should be func(index int, value interface{}) bool
|
|
||||||
func FlattenDeep(slice interface{}) interface{} //flattens slice recursive
|
|
||||||
func ForEach(slice, function interface{}) //iterates over elements of slice and invokes function for each element, function signature should be func(index int, value interface{})
|
|
||||||
func IntSlice(slice interface{}) ([]int, error) //convert value to int slice
|
|
||||||
func InterfaceSlice(slice interface{}) []interface{} //convert value to interface{} slice
|
|
||||||
func Intersection(slices ...interface{}) interface{} //creates a slice of unique values that included by all slices.
|
|
||||||
func InsertByIndex(slice interface{}, index int, value interface{}) (interface{}, error) //insert the element into slice at index.
|
|
||||||
func Map(slice, function interface{}) interface{} //map lisce, function signature should be func(index int, value interface{}) interface{}
|
|
||||||
func ReverseSlice(slice interface{}) //revere slice
|
|
||||||
func Reduce(slice, function, zero interface{}) interface{} //reduce slice, function signature should be func(index int, value1, value2 interface{}) interface{}
|
|
||||||
func Shuffle(slice interface{}) interface{} //creates an slice of shuffled values
|
|
||||||
func SortByField(slice interface{}, field string, sortType ...string) error //sort struct slice by field
|
|
||||||
func Some(slice, function interface{}) bool //return true if any of the values in the list pass the predicate function, function signature should be func(index int, value interface{}) bool
|
|
||||||
func StringSlice(slice interface{}) []string //convert value to string slice
|
|
||||||
func Unique(slice interface{}) interface{} //remove duplicate elements in slice
|
|
||||||
func Union(slices ...interface{}) interface{} //Union creates a slice of unique values, in order, from all given slices. using == for equality comparisons
|
|
||||||
func UpdateByIndex(slice interface{}, index int, value interface{}) (interface{}, error) //update the slice element at index.
|
|
||||||
func Without(slice interface{}, values ...interface{}) interface{} //creates a slice excluding all given values
|
|
||||||
func GroupBy(slice, function interface{}) (interface{}, interface{}) // groups slice into two categories
|
|
||||||
func Count(slice, function interface{}) int // Count iterates over elements of slice, returns a count of all matched elements
|
|
||||||
```
|
|
||||||
|
|
||||||
### 11. strutil is for processing string
|
|
||||||
|
|
||||||
- Contain functions to precess string
|
|
||||||
- Usage: import "github.com/duke-git/lancet/strutil"
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/strutil"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
str := "Foo-Bar"
|
|
||||||
camelCaseStr := strutil.CamelCase(str)
|
|
||||||
fmt.Println(camelCaseStr) //fooBar
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- Function list:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func After(s, char string) string //create substring in source string after position when char first appear
|
|
||||||
func AfterLast(s, char string) string //create substring in source string after position when char last appear
|
|
||||||
func Before(s, char string) string //create substring in source string before position when char first appear
|
|
||||||
func BeforeLast(s, char string) string //create substring in source string before position when char last appear
|
|
||||||
func CamelCase(s string) string //covert string to camelCase string. "foo bar" -> "fooBar"
|
|
||||||
func Capitalize(s string) string //convert the first character of a string to upper case, "fOO" -> "Foo"
|
|
||||||
func IsString(v interface{}) bool //check if the value data type is string or not
|
|
||||||
func KebabCase(s string) string //covert string to kebab-case, "foo_Bar" -> "foo-bar"
|
|
||||||
func LowerFirst(s string) string //convert the first character of string to lower case
|
|
||||||
func UpperFirst(s string) string //converts the first character of string to upper case
|
|
||||||
func PadEnd(source string, size int, padStr string) string //pads string on the right side if it's shorter than size
|
|
||||||
func PadStart(source string, size int, padStr string) string//pads string on the left side if it's shorter than size
|
|
||||||
func ReverseStr(s string) string //return string whose char order is reversed to the given string
|
|
||||||
func SnakeCase(s string) string //covert string to snake_case "fooBar" -> "foo_bar"
|
|
||||||
func Wrap(str string, wrapWith string) string //wrap a string with another string.
|
|
||||||
func Unwrap(str string, wrapToken string) string //unwrap a given string from anther string. will change str value
|
|
||||||
```
|
|
||||||
### 12. system contain some functions about os, runtime, shell command.
|
|
||||||
|
|
||||||
- Generate random string and int.
|
|
||||||
- Usage: import "github.com/duke-git/lancet/system".
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/system"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
envFoo := system.GetOsEnv("foo")
|
|
||||||
fmt.Println(envFoo)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- Function list:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func IsWindows() bool //check if current os is windows
|
|
||||||
func IsLinux() bool //check if current os is linux
|
|
||||||
func IsMac() bool //check if current os is macos
|
|
||||||
func GetOsEnv(key string) string //gets the value of the environment variable named by the key.
|
|
||||||
func SetOsEnv(key, value string) error //sets the value of the environment variable named by the key.
|
|
||||||
func RemoveOsEnv(key string) error //remove a single environment variable.
|
|
||||||
func CompareOsEnv(key, comparedEnv string) bool //gets env named by the key and compare it with comparedEnv
|
|
||||||
func ExecCommand(command string) (stdout, stderr string, err error) //use shell /bin/bash -c to execute command
|
|
||||||
```
|
|
||||||
|
|
||||||
### 13. validator is for data validation
|
|
||||||
|
|
||||||
- Contain function for data validation.
|
|
||||||
- Usage: import "github.com/duke-git/lancet/validator".
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/validator"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
str := "Foo-Bar"
|
|
||||||
isAlpha := validator.IsAlpha(str)
|
|
||||||
fmt.Println(isAlpha) //false
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- Function list:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func ContainChinese(s string) bool //check if the string contain mandarin chinese
|
|
||||||
func IsAlpha(s string) bool //checks if the string contains only letters (a-zA-Z)
|
|
||||||
func IsBase64(base64 string) bool //check if the string is base64 string
|
|
||||||
func IsAllUpper(str string) bool //check if the string is all upper case letters A-Z
|
|
||||||
func IsAllLower(str string) bool //check if the string is all lower case letters a-z
|
|
||||||
func ContainUpper(str string) bool //check if the string contain at least one upper case letter A-Z
|
|
||||||
func ContainLower(str string) bool //check if the string contain at least one lower case letter a-z
|
|
||||||
func ContainLetter(str string) bool //check if the string contain at least one letter
|
|
||||||
func IsJSON(str string) bool //checks if the string is valid JSON
|
|
||||||
func IsChineseMobile(mobileNum string) bool //check if the string is chinese mobile number
|
|
||||||
func IsChineseIdNum(id string) bool //check if the string is chinese id number
|
|
||||||
func IsChinesePhone(phone string) bool //check if the string is chinese phone number
|
|
||||||
func IsCreditCard(creditCart string) bool //check if the string is credit card
|
|
||||||
func IsDns(dns string) bool //check if the string is dns
|
|
||||||
func IsEmail(email string) bool //check if the string is a email address
|
|
||||||
func IsEmptyString(s string) bool //check if the string is empty
|
|
||||||
func IsFloatStr(s string) bool //check if the string can convert to a float
|
|
||||||
func IsNumberStr(s string) bool //check if the string can convert to a number
|
|
||||||
func IsRegexMatch(s, regex string) bool //check if the string match the regexp
|
|
||||||
func IsIntStr(s string) bool //check if the string can convert to a integer
|
|
||||||
func IsIp(ipstr string) bool //check if the string is a ip address
|
|
||||||
func IsIpV4(ipstr string) bool //check if the string is a ipv4 address
|
|
||||||
func IsIpV6(ipstr string) bool //check if the string is a ipv6 address
|
|
||||||
func IsStrongPassword(password string, length int) bool //check if the string is strong password (alpha(lower+upper) + number + special chars(!@#$%^&*()?><))
|
|
||||||
func IsUrl(str string) bool //check if the string is url
|
|
||||||
func IsWeakPassword(password string) bool //check if the string is weak password(only letter or only number or letter + number)
|
|
||||||
```
|
|
||||||
|
|||||||
813
README_zh-CN.md
813
README_zh-CN.md
@@ -1,26 +1,31 @@
|
|||||||
# Lancet
|
<div align=center>
|
||||||
<p style="font-size: 18px">
|
<img src="./logo.png" width="200" height="200"/>
|
||||||
lancet(柳叶刀)是一个全面、高效、可复用的go语言工具函数库。 lancet受到了java apache common包和lodash.js的启发。
|
|
||||||
</p>
|
|
||||||
|
|
||||||

|
<br/>
|
||||||
[](https://github.com/duke-git/lancet/releases)
|
|
||||||
|

|
||||||
|
[](https://github.com/duke-git/lancet/releases)
|
||||||
[](https://pkg.go.dev/github.com/duke-git/lancet)
|
[](https://pkg.go.dev/github.com/duke-git/lancet)
|
||||||
[](https://goreportcard.com/report/github.com/duke-git/lancet)
|
[](https://goreportcard.com/report/github.com/duke-git/lancet)
|
||||||
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
|
[](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
|
||||||
[](https://codecov.io/gh/duke-git/lancet)
|
[](https://codecov.io/gh/duke-git/lancet)
|
||||||
[](https://github.com/duke-git/lancet/blob/main/LICENSE)
|
[](https://github.com/duke-git/lancet/blob/v1/LICENSE)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
<p style="font-size: 18px">
|
||||||
|
lancet(柳叶刀)是一个全面、高效、可复用的go语言工具函数库。 lancet受到了java apache common包和lodash.js的启发。
|
||||||
|
</p>
|
||||||
|
|
||||||
简体中文 | [English](./README.md)
|
简体中文 | [English](./README.md)
|
||||||
|
|
||||||
|
|
||||||
## 特性
|
## 特性
|
||||||
|
|
||||||
- 👏 全面、高效、可复用
|
- 👏 全面、高效、可复用
|
||||||
- 💪 160+常用go工具函数,支持string、slice、datetime、net、crypt...
|
- 💪 200+常用 go 工具函数,支持 string、slice、datetime、net、crypt...
|
||||||
- 💅 只依赖go标准库
|
- 💅 只依赖 go 标准库
|
||||||
- 🌍 所有导出函数单元测试覆盖率100%
|
- 🌍 所有导出函数单元测试覆盖率 100%
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
@@ -30,7 +35,7 @@ go get github.com/duke-git/lancet
|
|||||||
|
|
||||||
## 用法
|
## 用法
|
||||||
|
|
||||||
lancet是以包的结构组织代码的,使用时需要导入相应的包名。例如:如果使用字符串相关函数,需要导入strutil包:
|
lancet 是以包的结构组织代码的,使用时需要导入相应的包名。例如:如果使用字符串相关函数,需要导入 strutil 包:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "github.com/duke-git/lancet/strutil"
|
import "github.com/duke-git/lancet/strutil"
|
||||||
@@ -38,7 +43,7 @@ import "github.com/duke-git/lancet/strutil"
|
|||||||
|
|
||||||
## 例子
|
## 例子
|
||||||
|
|
||||||
此处以字符串工具函数ReverseStr(逆序字符串)为例,需要导入strutil包:
|
此处以字符串工具函数 Reverse(逆序字符串)为例,需要导入 strutil 包:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
@@ -50,548 +55,380 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := "hello"
|
s := "hello"
|
||||||
rs := strutil.ReverseStr(s)
|
rs := strutil.Reverse(s)
|
||||||
fmt.Println(rs) //olleh
|
fmt.Println(rs) //olleh
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## API文档
|
## API 文档
|
||||||
### 1. convertor数据转换包
|
|
||||||
|
|
||||||
- 转换函数支持常用数据类型之间的转换
|
### 1. convertor 转换器包支持一些常见的数据类型转换。
|
||||||
- 导入包:import "github.com/duke-git/lancet/convertor"
|
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/convertor"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/convertor"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
s := "12.3"
|
|
||||||
f, err := convertor.ToFloat(s)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Errorf("error is %s", err.Error())
|
|
||||||
}
|
|
||||||
fmt.Println(f) // 12.3
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- 函数列表:
|
#### 函数列表:
|
||||||
|
|
||||||
|
- [ColorHexToRGB](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ColorHexToRGB)
|
||||||
|
- [ColorRGBToHex](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ColorRGBToHex)
|
||||||
|
- [ToBool](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToBool)
|
||||||
|
- [ToBytes](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToBytes)
|
||||||
|
- [ToChar](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToChar)
|
||||||
|
- [ToChannel](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToChannel)
|
||||||
|
- [ToInt](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToInt)
|
||||||
|
- [ToJson](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToJson)
|
||||||
|
- [ToString](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToString)
|
||||||
|
- [StructToMap](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#StructToMap)
|
||||||
|
- [EncodeByte](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#EncodeByte)
|
||||||
|
- [DecodeByte](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#DecodeByte)
|
||||||
|
- [DeepClone](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#DeepClone)
|
||||||
|
- [CopyProperties](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#CopyProperties)
|
||||||
|
|
||||||
|
### 2. cryptor 加密包支持数据加密和解密,获取 md5,hash 值。支持 base64, md5, hmac, aes, des, rsa。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ColorHexToRGB(colorHex string) (red, green, blue int) //颜色值16进制转rgb
|
import "github.com/duke-git/lancet/cryptor"
|
||||||
func ColorRGBToHex(red, green, blue int) string //颜色值rgb转16进制
|
|
||||||
func ToBool(s string) (bool, error) //字符串转成Bool
|
|
||||||
func ToBytes(data interface{}) ([]byte, error) //interface转成byte slice
|
|
||||||
func ToChar(s string) []string //字符串转成字符slice
|
|
||||||
func ToFloat(value interface{}) (float64, error) //interface转成float64
|
|
||||||
func ToInt(value interface{}) (int64, error) //interface转成int64
|
|
||||||
func ToJson(value interface{}) (string, error) //interface转成json string
|
|
||||||
func ToString(value interface{}) string //interface转成string
|
|
||||||
func StructToMap(value interface{}) (map[string]interface{}, error) //struct串转成map, 需要设置struct tag `json`
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. cryptor加解密包
|
#### 函数列表:
|
||||||
|
|
||||||
- 加密函数支持md5, hmac, aes, des, ras
|
- [AesEcbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesEcbEncrypt)
|
||||||
- 导入包:import "github.com/duke-git/lancet/cryptor"
|
- [AesEcbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesEcbDecrypt)
|
||||||
|
- [AesCbcEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesCbcEncrypt)
|
||||||
|
- [AesCbcDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesCbcDecrypt)
|
||||||
|
- [AesCtrCrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesCtrCrypt)
|
||||||
|
- [AesCfbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesCfbEncrypt)
|
||||||
|
- [AesCfbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesCfbDecrypt)
|
||||||
|
- [AesOfbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesOfbEncrypt)
|
||||||
|
- [AesOfbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#AesOfbDecrypt)
|
||||||
|
- [Base64StdEncode](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#Base64StdEncode)
|
||||||
|
- [Base64StdDecode](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#Base64StdDecode)
|
||||||
|
- [DesEcbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesEcbEncrypt)
|
||||||
|
- [DesEcbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesEcbDecrypt)
|
||||||
|
- [DesCbcEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesCbcEncrypt)
|
||||||
|
- [DesCbcDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesCbcDecrypt)
|
||||||
|
- [DesCtrCrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesCtrCrypt)
|
||||||
|
- [DesCfbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesCfbEncrypt)
|
||||||
|
- [DesCfbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesCfbDecrypt)
|
||||||
|
- [DesOfbEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesOfbEncrypt)
|
||||||
|
- [DesOfbDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#DesOfbDecrypt)
|
||||||
|
- [HmacMd5](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#HmacMd5)
|
||||||
|
- [HmacSha1](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#HmacSha1)
|
||||||
|
- [HmacSha256](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#HmacSha256)
|
||||||
|
- [HmacSha512](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#HmacSha512)
|
||||||
|
- [Md5String](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#Md5String)
|
||||||
|
- [Md5File](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#Md5File)
|
||||||
|
- [Sha1](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#Sha1)
|
||||||
|
- [Sha256](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#Sha256)
|
||||||
|
- [Sha512](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#Sha512)
|
||||||
|
- [GenerateRsaKey](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#GenerateRsaKey)
|
||||||
|
- [RsaEncrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#RsaEncrypt)
|
||||||
|
- [RsaDecrypt](https://github.com/duke-git/lancet/blob/v1/docs/cryptor_zh-CN.md#RsaDecrypt)
|
||||||
|
|
||||||
|
### 3. datetime 日期时间处理包,格式化日期,比较日期。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/datetime"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/cryptor"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
data := "hello"
|
|
||||||
key := "abcdefghijklmnop"
|
|
||||||
|
|
||||||
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
|
||||||
decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
|
|
||||||
fmt.Println(string(decrypted)) // hello
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- 函数列表:
|
#### 函数列表:
|
||||||
|
|
||||||
|
- [AddDay](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#AddDay)
|
||||||
|
- [AddHour](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#AddHour)
|
||||||
|
- [AddMinute](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#AddMinute)
|
||||||
|
- [BeginOfMinute](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfMinute)
|
||||||
|
- [BeginOfHour](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfHour)
|
||||||
|
- [BeginOfDay](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfDay)
|
||||||
|
- [BeginOfWeek](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfWeek)
|
||||||
|
- [BeginOfMonth](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfMonth)
|
||||||
|
- [BeginOfYear](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#BeginOfYear)
|
||||||
|
- [EndOfMinute](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfMinute)
|
||||||
|
- [EndOfHour](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfHour)
|
||||||
|
- [EndOfDay](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfDay)
|
||||||
|
- [EndOfWeek](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfWeek)
|
||||||
|
- [EndOfMonth](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfMonth)
|
||||||
|
- [EndOfYear](https://github.com/duke-git/lancet/blob/v1/docs/datetime.md#EndOfYear)
|
||||||
|
- [GetNowDate](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#GetNowDate)
|
||||||
|
- [GetNowTime](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#GetNowTime)
|
||||||
|
- [GetNowDateTime](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#GetNowDateTime)
|
||||||
|
- [GetZeroHourTimestamp](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#GetZeroHourTimestamp)
|
||||||
|
- [GetNightTimestamp](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#GetNightTimestamp)
|
||||||
|
- [FormatTimeToStr](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#FormatTimeToStr)
|
||||||
|
- [FormatStrToTime](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#FormatStrToTime)
|
||||||
|
- [NewUnix](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#NewUnix)
|
||||||
|
- [NewUnixNow](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#NewUnixNow)
|
||||||
|
- [NewFormat](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#NewFormat)
|
||||||
|
- [NewISO8601](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#NewISO8601)
|
||||||
|
- [ToUnix](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#ToUnix)
|
||||||
|
- [ToFormat](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#ToFormat)
|
||||||
|
- [ToFormatForTpl](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#ToFormatForTpl)
|
||||||
|
- [ToIso8601](https://github.com/duke-git/lancet/blob/v1/docs/datetime_zh-CN.md#ToIso8601)
|
||||||
|
|
||||||
|
### 4. fileutil 包支持文件基本操作。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func AesEcbEncrypt(data, key []byte) []byte //AES ECB模式加密
|
import "github.com/duke-git/lancet/fileutil"
|
||||||
func AesEcbDecrypt(encrypted, key []byte) []byte //AES ECB模式解密
|
|
||||||
func AesCbcEncrypt(data, key []byte) []byte //AES CBC模式加密
|
|
||||||
func AesCbcDecrypt(encrypted, key []byte) []byte //AES CBC模式解密
|
|
||||||
func AesCtrCrypt(data, key []byte) []byte //AES CTR模式加密/解密
|
|
||||||
func AesCfbEncrypt(data, key []byte) []byte //AES CFB模式加密
|
|
||||||
func AesCfbDecrypt(encrypted, key []byte) []byte //AES CFB模式解密
|
|
||||||
func AesOfbEncrypt(data, key []byte) []byte //AES OFB模式加密
|
|
||||||
func AesOfbDecrypt(data, key []byte) []byte //AES OFB模式解密
|
|
||||||
func Base64StdEncode(s string) string //base64编码
|
|
||||||
func Base64StdDecode(s string) string //base64解码
|
|
||||||
func DesCbcEncrypt(data, key []byte) []byte //DES CBC模式加密
|
|
||||||
func DesCbcDecrypt(encrypted, key []byte) []byte //DES CBC模式解密
|
|
||||||
func DesCtrCrypt(data, key []byte) []byte //DES CTR模式加密/解密
|
|
||||||
func DesCfbEncrypt(data, key []byte) []byte //DES CFB模式加密
|
|
||||||
func DesCfbDecrypt(encrypted, key []byte) []byte //DES CFB模式解密
|
|
||||||
func DesOfbEncrypt(data, key []byte) []byte //DES OFB模式加密
|
|
||||||
func DesOfbDecrypt(data, key []byte) []byte //DES OFB模式解密
|
|
||||||
func HmacMd5(data, key string) string //获取hmac md5值
|
|
||||||
func HmacSha1(data, key string) string //获取hmac sha1值
|
|
||||||
func HmacSha256(data, key string) string //获取hmac sha256值
|
|
||||||
func HmacSha512(data, key string) string //获取hmac sha512值
|
|
||||||
func Md5String(s string) string //获取字符串md5值
|
|
||||||
func Md5File(filename string) (string, error) //获取文件md5值
|
|
||||||
func Sha1(data string) string //获取sha1值
|
|
||||||
func Sha256(data string) string //获取sha256值
|
|
||||||
func Sha512(data string) string //获取sha512值
|
|
||||||
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) //生成RSA私钥文件
|
|
||||||
func RsaEncrypt(data []byte, pubKeyFileName string) []byte //RSA加密
|
|
||||||
func RsaDecrypt(data []byte, privateKeyFileName string) []byte //RSA解密
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. datetime日期时间处理包
|
#### 函数列表:
|
||||||
|
|
||||||
- 处理日期时间
|
- [ClearFile](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#ClearFile)
|
||||||
- 导入包:import "github.com/duke-git/lancet/datetime"
|
- [CreateFile](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#CreateFile)
|
||||||
|
- [CreateDir](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#CreateDir)
|
||||||
|
- [CopyFile](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#CopyFile)
|
||||||
|
- [FileMode](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#FileMode)
|
||||||
|
- [MiMeType](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#MiMeType)
|
||||||
|
- [IsExist](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#IsExist)
|
||||||
|
- [IsLink](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#IsLink)
|
||||||
|
- [IsDir](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#IsDir)
|
||||||
|
- [ListFileNames](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#ListFileNames)
|
||||||
|
- [RemoveFile](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#RemoveFile)
|
||||||
|
- [ReadFileToString](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#ReadFileToString)
|
||||||
|
- [ReadFileByLine](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#ReadFileByLine)
|
||||||
|
- [Zip](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#Zip)
|
||||||
|
- [UnZip](https://github.com/duke-git/lancet/blob/v1/docs/fileutil_zh-CN.md#UnZip)
|
||||||
|
|
||||||
|
### 5. formatter 格式化器包含一些数据格式化处理方法。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/formatter"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/datetime"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
now := time.Now()
|
|
||||||
s := datetime.FormatTimeToStr(now, "yyyy-mm-dd hh:mm:ss")
|
|
||||||
fmt.Println(s) // 2021-11-24 11:16:55
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- 函数列表:
|
#### 函数列表:
|
||||||
|
|
||||||
|
- [Comma](https://github.com/duke-git/lancet/blob/v1/docs/formatter_zh-CN.md#Comma)
|
||||||
|
|
||||||
|
### function 函数包控制函数执行流程,包含部分函数式编程。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func AddDay(t time.Time, day int64) time.Time //加减天数
|
import "github.com/duke-git/lancet/function"
|
||||||
func AddHour(t time.Time, hour int64) time.Time //加减小时数
|
|
||||||
func AddMinute(t time.Time, minute int64) time.Time //加减分钟数
|
|
||||||
func GetNowDate() string //获取当天日期 格式yyyy-mm-dd
|
|
||||||
func GetNowTime() string //获取当前时间 格式hh:mm:ss
|
|
||||||
func GetNowDateTime() string //获取当前日期时间 格式yyyy-mm-dd hh:mm:ss
|
|
||||||
func GetZeroHourTimestamp() int64 //获取当天零时时间戳(00:00)
|
|
||||||
func GetNightTimestamp() int64 //获取当天23时时间戳(23:59)
|
|
||||||
func FormatTimeToStr(t time.Time, format string) string //时间格式化字符串
|
|
||||||
func FormatStrToTime(str, format string) time.Time //字符串转换成时间
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. fileutil文件处理包
|
#### 函数列表:
|
||||||
|
|
||||||
- 文件处理常用函数
|
- [After](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#After)
|
||||||
- 导入包:import "github.com/duke-git/lancet/fileutil"
|
- [Before](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#Before)
|
||||||
|
- [Curry](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#Curry)
|
||||||
|
- [Compose](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#Compose)
|
||||||
|
- [Debounced](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#Debounced)
|
||||||
|
- [Delay](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#Delay)
|
||||||
|
- [Pipeline](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#Pipeline)
|
||||||
|
- [Schedule](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#Schedule)
|
||||||
|
- [Watcher](https://github.com/duke-git/lancet/blob/v1/docs/function_zh-CN.md#Watcher)
|
||||||
|
|
||||||
|
### 6. mathutil 包实现了一些数学计算的函数。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/mathutil"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/fileutil"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Println(fileutil.IsDir("./")) // true
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- 函数列表:
|
#### Function list:
|
||||||
|
|
||||||
|
- [Exponent](https://github.com/duke-git/lancet/blob/v1/docs/mathutil_zh-CN.md#Exponent)
|
||||||
|
- [Fibonacci](https://github.com/duke-git/lancet/blob/v1/docs/mathutil_zh-CN.md#Fibonacci)
|
||||||
|
- [Factorial](https://github.com/duke-git/lancet/blob/v1/docs/mathutil_zh-CN.md#Factorial)
|
||||||
|
- [Percent](https://github.com/duke-git/lancet/blob/v1/docs/mathutil_zh-CN.md#Percent)
|
||||||
|
- [RoundToFloat](https://github.com/duke-git/lancet/blob/v1/docs/mathutil_zh-CN.md#RoundToFloat)
|
||||||
|
- [RoundToString](https://github.com/duke-git/lancet/blob/v1/docs/mathutil_zh-CN.md#RoundToString)
|
||||||
|
- [TruncRound](https://github.com/duke-git/lancet/blob/v1/docs/mathutil_zh-CN.md#TruncRound)
|
||||||
|
|
||||||
|
### 7. netutil 网络包支持获取 ip 地址,发送 http 请求。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func ClearFile(path string) error //清空文件内容
|
import "github.com/duke-git/lancet/netutil"
|
||||||
func CreateFile(path string) bool //创建文件
|
|
||||||
func FileMode(path string) (fs.FileMode, error) //返回文件mode信息
|
|
||||||
func MiMeType(file interface{}) string //返回文件mime类型
|
|
||||||
func IsExist(path string) bool //判断文件/目录是否存在
|
|
||||||
func IsDir(path string) bool //判断是否为目录
|
|
||||||
func IsLink(path string) bool //检查文件是否为符号链接文件
|
|
||||||
func RemoveFile(path string) error //删除文件
|
|
||||||
func CopyFile(srcFilePath string, dstFilePath string) error //复制文件
|
|
||||||
func ListFileNames(path string) ([]string, error) //列出目录下所有文件名称
|
|
||||||
func ReadFileToString(path string) (string, error) //读取文件内容为字符串
|
|
||||||
func ReadFileByLine(path string)([]string, error) //按行读取文件内容
|
|
||||||
func Zip(fpath string, destPath string) error //压缩文件fpath参数可以是文件或目录,destPath是压缩后目标文件
|
|
||||||
func UnZip(zipFile string, destPath string) error //解压文件,并将文件存储在destPath目录中
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. formatter格式化处理包
|
#### 函数列表:
|
||||||
|
|
||||||
- 格式化相关处理函数
|
- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#ConvertMapToQueryString)
|
||||||
- 导入包:import "github.com/duke-git/lancet/formatter"
|
- [EncodeUrl](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#EncodeUrl)
|
||||||
|
- [GetInternalIp](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#GetInternalIp)
|
||||||
|
- [GetIps](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#GetIps)
|
||||||
|
- [GetMacAddrs](https://github.com/duke-git/lancet/blob/v1/docs/netutil.md#GetMacAddrs)
|
||||||
|
- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#GetPublicIpInfo)
|
||||||
|
- [GetRequestPublicIp](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#GetRequestPublicIp)
|
||||||
|
- [IsPublicIP](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#IsPublicIP)
|
||||||
|
- [IsInternalIP](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#IsInternalIP)
|
||||||
|
- [HttpGet](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#HttpGet)
|
||||||
|
- [HttpDelete](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#HttpDelete)
|
||||||
|
- [HttpPost](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#HttpPost)
|
||||||
|
- [HttpPut](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#HttpPut)
|
||||||
|
- [HttpPatch](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#HttpPatch)
|
||||||
|
- [ParseHttpResponse](https://github.com/duke-git/lancet/blob/v1/docs/netutil_zh-CN.md#ParseHttpResponse)
|
||||||
|
|
||||||
|
### 8. random 随机数生成器包,可以生成随机[]bytes, int, string。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/random"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/formatter"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Println(formatter.Comma("12345", "")) // "12,345"
|
|
||||||
fmt.Println(formatter.Comma(12345.67, "¥")) // "¥12,345.67"
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- 函数列表:
|
#### 函数列表:
|
||||||
|
|
||||||
|
- [RandBytes](https://github.com/duke-git/lancet/blob/v1/docs/random_zh-CN.md#RandBytes)
|
||||||
|
- [RandInt](https://github.com/duke-git/lancet/blob/v1/docs/random_zh-CN.md#RandInt)
|
||||||
|
- [RandString](https://github.com/duke-git/lancet/blob/v1/docs/random_zh-CN.md#RandString)
|
||||||
|
- [RandUpper](https://github.com/duke-git/lancet/blob/v1/docs/random_zh-CN.md#RandUpper)
|
||||||
|
- [RandLower](https://github.com/duke-git/lancet/blob/v1/docs/random_zh-CN.md#RandLower)
|
||||||
|
- [RandNumeral](https://github.com/duke-git/lancet/blob/v1/docs/random_zh-CN.md#RandNumeral)
|
||||||
|
- [RandNumeralOrLetter](https://github.com/duke-git/lancet/blob/v1/docs/random_zh-CN.md#RandNumeralOrLetter)
|
||||||
|
- [UUIdV4](https://github.com/duke-git/lancet/blob/v1/docs/random.md#UUIdV4)
|
||||||
|
|
||||||
|
### 9. retry 重试执行函数直到函数运行成功或被 context cancel。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func Comma(v interface{}, symbol string) string //用逗号每隔3位分割数字/字符串
|
import "github.com/duke-git/lancet/retry"
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6. function包可以控制函数执行,支持部分函数式编程
|
#### 函数列表:
|
||||||
|
|
||||||
- 控制函数执行,支持部分函数式编程
|
- [Context](https://github.com/duke-git/lancet/blob/v1/docs/retry_zh-CN.md#Context)
|
||||||
- 导入包:import "github.com/duke-git/lancet/function"
|
- [Retry](https://github.com/duke-git/lancet/blob/v1/docs/retry_zh-CN.md#Retry)
|
||||||
|
- [RetryFunc](https://github.com/duke-git/lancet/blob/v1/docs/retry_zh-CN.md#RetryFunc)
|
||||||
|
- [RetryDuration](https://github.com/duke-git/lancet/blob/v1/docs/retry_zh-CN.md#RetryDuration)
|
||||||
|
- [RetryTimes](https://github.com/duke-git/lancet/blob/v1/docs/retry_zh-CN.md#RetryTimes)
|
||||||
|
|
||||||
|
### 10. slice 包包含操作切片的方法集合。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/slice"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/duke-git/lancet/function"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var print = func(s string) {
|
|
||||||
fmt.Println(s)
|
|
||||||
}
|
|
||||||
function.Delay(2*time.Second, print, "hello world")
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Function list:
|
#### 函数列表:
|
||||||
|
|
||||||
|
- [AppendIfAbsent](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#AppendIfAbsent)
|
||||||
|
- [Contain](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Contain)
|
||||||
|
- [ContainSubSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#ContainSubSlice)
|
||||||
|
- [Chunk](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Chunk)
|
||||||
|
- [Compact](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Compact)
|
||||||
|
- [Concat](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Concat)
|
||||||
|
- [Count](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Count)
|
||||||
|
- [Difference](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Difference)
|
||||||
|
- [DifferenceBy](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#DifferenceBy)
|
||||||
|
- [DeleteByIndex](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#DeleteByIndex)
|
||||||
|
- [Drop](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Drop)
|
||||||
|
- [Every](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Every)
|
||||||
|
- [Equal](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Equal)
|
||||||
|
- [EqualWith](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#EqualWith)
|
||||||
|
- [Filter](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Filter)
|
||||||
|
- [Find](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Find)
|
||||||
|
- [FindLast](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#FindLast)
|
||||||
|
- [FlattenDeep](https://github.com/duke-git/lancet/blob/v1/docs/slice.md#FlattenDeep)
|
||||||
|
- [ForEach](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#ForEach)
|
||||||
|
- [GroupBy](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#GroupBy)
|
||||||
|
- [IntSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#IntSlice)
|
||||||
|
- [IndexOf](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#IndexOf)
|
||||||
|
- [LastIndexOf](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#LastIndexOf)
|
||||||
|
- [InterfaceSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#InterfaceSlice)
|
||||||
|
- [Intersection](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Intersection)
|
||||||
|
- [InsertByIndex](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#InsertByIndex)
|
||||||
|
- [Map](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Map)
|
||||||
|
- [ReverseSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#ReverseSlice)
|
||||||
|
- [Reduce](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Reduce)
|
||||||
|
- [Shuffle](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Shuffle)
|
||||||
|
- [SortByField](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#SortByField)
|
||||||
|
- [Some](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Some)
|
||||||
|
- [StringSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#StringSlice)
|
||||||
|
- [ToSlice](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#ToSlice)
|
||||||
|
- [ToSlicePointer](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#ToSlice)
|
||||||
|
- [Unique](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Unique)
|
||||||
|
- [UniqueBy](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#UniqueBy)
|
||||||
|
- [Union](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Union)
|
||||||
|
- [UpdateByIndex](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#UpdateByIndex)
|
||||||
|
- [Without](https://github.com/duke-git/lancet/blob/v1/docs/slice_zh-CN.md#Without)
|
||||||
|
|
||||||
|
### 12. strutil 包含处理字符串的相关函数。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func After(n int, fn interface{}) func(args ...interface{}) []reflect.Value //创建一个函数, 只有在运行了n次之后才有效果
|
import "github.com/duke-git/lancet/strutil"
|
||||||
func Before(n int, fn interface{}) func(args ...interface{}) []reflect.Value //创建一个函数,调用不超过n次。 当n已经达到时,最后一个函数调用的结果将被记住并返回
|
|
||||||
func (f Fn) Curry(i interface{}) func(...interface{}) interface{} //函数柯里化
|
|
||||||
func Compose(fnList ...func(...interface{}) interface{}) func(...interface{}) interface{} //从右至左组合函数
|
|
||||||
func Delay(delay time.Duration, fn interface{}, args ...interface{}) //延迟调用函数
|
|
||||||
func Debounced(fn func(), duration time.Duration) func() //go防抖函数,在duration时间内连续调用只会执行一次.
|
|
||||||
func Schedule(d time.Duration, fn interface{}, args ...interface{}) chan bool //每隔duration时间调用函数, 关闭返回通道可以停止调用
|
|
||||||
func (w *Watcher) Start() //开时watcher
|
|
||||||
func (w *Watcher) Stop() //开时watcher
|
|
||||||
func (w *Watcher) Reset() {} //重置代码watcher
|
|
||||||
func (w *Watcher) GetElapsedTime() time.Duration //get code excution elapsed time.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 7. netutil网络处理包
|
#### 函数列表:
|
||||||
|
|
||||||
- 处理ip, http请求相关函数
|
- [After](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#After)
|
||||||
- 导入包:import "github.com/duke-git/lancet/netutil"
|
- [AfterLast](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#AfterLast)
|
||||||
- http方法params参数顺序:header, query string, body, httpclient
|
- [Before](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#Before)
|
||||||
|
- [BeforeLast](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#BeforeLast)
|
||||||
|
- [CamelCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#CamelCase)
|
||||||
|
- [Capitalize](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#Capitalize)
|
||||||
|
- [IsString](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#IsString)
|
||||||
|
- [KebabCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#KebabCase)
|
||||||
|
- [UpperKebabCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#UpperKebabCase)
|
||||||
|
- [LowerFirst](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#LowerFirst)
|
||||||
|
- [UpperFirst](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#UpperFirst)
|
||||||
|
- [Pad](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#Pad)
|
||||||
|
- [PadEnd](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#PadEnd)
|
||||||
|
- [PadStart](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#PadStart)
|
||||||
|
- [Reverse](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#Reverse)
|
||||||
|
- [SnakeCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#SnakeCase)
|
||||||
|
- [UpperSnakeCase](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#UpperSnakeCase)
|
||||||
|
- [SplitEx](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#SplitEx)
|
||||||
|
- [Wrap](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#Wrap)
|
||||||
|
- [Unwrap](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#Unwrap)
|
||||||
|
- [SplitWords](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#SplitWords)
|
||||||
|
- [WordCount](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#WordCount)
|
||||||
|
|
||||||
|
### 13. system 包含 os, runtime, shell command 相关函数。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
import "github.com/duke-git/lancet/system"
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/netutil"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
url := "https://gutendex.com/books?"
|
|
||||||
header := make(map[string]string)
|
|
||||||
header["Content-Type"] = "application/json"
|
|
||||||
queryParams := make(map[string]interface{})
|
|
||||||
queryParams["ids"] = "1"
|
|
||||||
|
|
||||||
resp, err := netutil.HttpGet(url, header, queryParams)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
body, _ := ioutil.ReadAll(resp.Body)
|
|
||||||
fmt.Println("response: ", resp.StatusCode, string(body))
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- 函数列表:
|
#### 函数列表:
|
||||||
|
|
||||||
|
- [IsWindows](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#IsWindows)
|
||||||
|
- [IsLinux](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#IsLinux)
|
||||||
|
- [IsMac](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#IsMac)
|
||||||
|
- [GetOsEnv](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#GetOsEnv)
|
||||||
|
- [SetOsEnv](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#SetOsEnv)
|
||||||
|
- [RemoveOsEnv](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#RemoveOsEnv)
|
||||||
|
- [CompareOsEnv](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#CompareOsEnv)
|
||||||
|
- [ExecCommand](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#ExecCommand)
|
||||||
|
- [GetOsBits](https://github.com/duke-git/lancet/blob/v1/docs/system_zh-CN.md#GetOsBits)
|
||||||
|
|
||||||
|
### 14. validator 验证器包,包含常用字符串格式验证函数。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
func GetInternalIp() string //获取内部ip
|
import "github.com/duke-git/lancet/validator"
|
||||||
func GetPublicIpInfo() (*PublicIpInfo, error) //获取公共ip信息: country, region, isp, city, lat, lon, ip
|
|
||||||
func IsPublicIP(IP net.IP) bool //判断ip是否为公共ip
|
|
||||||
func HttpGet(url string, params ...interface{}) (*http.Response, error) //http get请求
|
|
||||||
func HttpPost(url string, params ...interface{}) (*http.Response, error) //http post请求
|
|
||||||
func HttpPut(url string, params ...interface{}) (*http.Response, error) //http put请求
|
|
||||||
func HttpDelete(url string, params ...interface{}) (*http.Response, error) //http delete请求
|
|
||||||
func HttpPatch(url string, params ...interface{}) (*http.Response, error) //http patch请求
|
|
||||||
func ConvertMapToQueryString(param map[string]interface{}) string //将map转换成url query string
|
|
||||||
func ParseHttpResponse(resp *http.Response, obj interface{}) error //将http响应解码成特定interface
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8. random随机数处理包
|
#### 函数列表:
|
||||||
|
|
||||||
- 生成和处理随机数
|
- [ContainChinese](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#ContainChinese)
|
||||||
- 导入包:import "github.com/duke-git/lancet/random"
|
- [ContainLetter](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#ContainLetter)
|
||||||
|
- [ContainLower](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#ContainLower)
|
||||||
|
- [ContainUpper](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#ContainUpper)
|
||||||
|
- [IsAlpha](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsAlpha)
|
||||||
|
- [IsAllUpper](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsAllUpper)
|
||||||
|
- [IsAllLower](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsAllLower)
|
||||||
|
- [IsBase64](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsBase64)
|
||||||
|
- [IsChineseMobile](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsChineseMobile)
|
||||||
|
- [IsChineseIdNum](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsChineseIdNum)
|
||||||
|
- [IsChinesePhone](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsChinesePhone)
|
||||||
|
- [IsCreditCard](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsCreditCard)
|
||||||
|
- [IsDns](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsDns)
|
||||||
|
- [IsEmail](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsEmail)
|
||||||
|
- [IsEmptyString](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsEmptyString)
|
||||||
|
- [IsFloatStr](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsFloatStr)
|
||||||
|
- [IsNumberStr](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsNumberStr)
|
||||||
|
- [IsJSON](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsJSON)
|
||||||
|
- [IsRegexMatch](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsRegexMatch)
|
||||||
|
- [IsIntStr](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsIntStr)
|
||||||
|
- [IsIp](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsIp)
|
||||||
|
- [IsIpV4](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsIpV4)
|
||||||
|
- [IsIpV6](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsIpV6)
|
||||||
|
- [IsStrongPassword](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsStrongPassword)
|
||||||
|
- [IsUrl](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsUrl)
|
||||||
|
- [IsWeakPassword](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsWeakPassword)
|
||||||
|
- [IsZeroValue](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsZeroValue)
|
||||||
|
- [IsGBK](https://github.com/duke-git/lancet/blob/v1/docs/validator_zh-CN.md#IsGBK)
|
||||||
|
|
||||||
```go
|
## 如何贡献代码
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
非常感激任何的代码提交以使 lancet 的功能越来越强大。创建 pull request 时请遵守以下规则。
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/random"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
1. Fork lancet 仓库。
|
||||||
randStr := random.RandString(6)
|
2. 创建自己的特性分支。
|
||||||
fmt.Println(randStr)
|
3. 提交变更。
|
||||||
}
|
4. Push 分支。
|
||||||
```
|
5. 创建新的 pull request。
|
||||||
|
|
||||||
- 函数列表:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func RandBytes(length int) []byte //生成随机[]byte
|
|
||||||
func RandInt(min, max int) int //生成随机int
|
|
||||||
func RandString(length int) string //生成随机string
|
|
||||||
```
|
|
||||||
|
|
||||||
### 9. retry重试执行函数
|
|
||||||
|
|
||||||
- 重试执行函数直到函数成功或被context停止
|
|
||||||
- 默认重试次数5, 默认执行间隔3秒.
|
|
||||||
- Usage: import "github.com/duke-git/lancet/retry".
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/retry"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var number int
|
|
||||||
increaseNumber := func() error {
|
|
||||||
number++
|
|
||||||
if number == 3 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return errors.New("error occurs")
|
|
||||||
}
|
|
||||||
|
|
||||||
err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50))
|
|
||||||
|
|
||||||
fmt.Println(number) //3
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- Function list:
|
|
||||||
|
|
||||||
```go
|
|
||||||
type RetryFunc func() error //要重试执行的函数
|
|
||||||
func RetryTimes(n uint) //设置重试次数,默认5次
|
|
||||||
func RetryDuration(d time.Duration) //设置重试间隔时间,默认3秒
|
|
||||||
func Context(ctx context.Context) //context config
|
|
||||||
func Retry(retryFunc RetryFunc, opts ...Option) error //重试函数
|
|
||||||
```
|
|
||||||
|
|
||||||
### 10. slice切片操作包
|
|
||||||
|
|
||||||
- 切片操作相关函数
|
|
||||||
- 导入包:import "github.com/duke-git/lancet/slice"
|
|
||||||
- 由于go目前对范型支持不稳定,slice处理函数参数和返回值大部分为interface{}, 待范型特性稳定后,会重构相关函数
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/slice"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
nums := []int{1, 4, 3, 4, 6, 7, 3}
|
|
||||||
uniqueNums, _ := slice.IntSlice(slice.Unique(nums))
|
|
||||||
fmt.Println(uniqueNums) //[1 4 3 6 7]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- 函数列表:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func Contain(slice interface{}, value interface{}) bool //判断slice是否包含value
|
|
||||||
func ContainSubSlice(slice interface{}, subslice interface{}) bool //判断slice是否包含subslice
|
|
||||||
func Chunk(slice []interface{}, size int) [][]interface{} //均分slice
|
|
||||||
func Compact(slice interface{}) interface{} //去除slice中的false vule. false values are false, nil, 0, and ""
|
|
||||||
func Concat(slice interface{}, values ...interface{}) interface{} //连接values到slice中
|
|
||||||
func Difference(slice1, slice2 interface{}) interface{} //返回切片,其元素在slice1中,不在slice2中
|
|
||||||
func DifferenceBy(slice interface{}, comparedSlice interface{}, iterateeFn interface{}) interface{} //将slice 和comparedSlice中每个元素调用iterateeFn后作比较,如果不相等返回slice中的元素。
|
|
||||||
func DeleteByIndex(slice interface{}, start int, end ...int) (interface{}, error) //删除切片中start到end位置的值
|
|
||||||
func Drop(slice interface{}, n int) interface{} //创建一个新切片,当n大于0时删除原切片前n个元素,当n小于0时删除原切片后n个元素
|
|
||||||
func Every(slice, function interface{}) bool //slice中所有元素都符合函数条件时返回true, 否则返回false. 函数签名:func(index int, value interface{}) bool
|
|
||||||
func None(slice, function interface{}) bool //slice中所有元素都不符合函数条件时返回true, 否则返回false. 函数签名:func(index int, value interface{}) bool
|
|
||||||
func Find(slice, function interface{}) (interface{}, bool)//查找slice中第一个符合条件的元素,函数签名:func(index int, value interface{}) bool
|
|
||||||
func Filter(slice, function interface{}) interface{} //过滤slice, 函数签名:func(index int, value interface{}) bool
|
|
||||||
func FlattenDeep(slice interface{}) interface{} //将slice递归为一维切片。
|
|
||||||
func ForEach(slice, function interface{}) //遍历切片,在每个元素上执行函数,函数签名:func(index int, value interface{})
|
|
||||||
func IntSlice(slice interface{}) ([]int, error) //转成int切片
|
|
||||||
func InterfaceSlice(slice interface{}) []interface{} //转成interface{}切片
|
|
||||||
func Intersection(slices ...interface{}) interface{} //slice交集,去重
|
|
||||||
func InsertByIndex(slice interface{}, index int, value interface{}) (interface{}, error) //在切片中index位置插入value
|
|
||||||
func Map(slice, function interface{}) interface{} //遍历切片, 函数签名:func(index int, value interface{}) interface{}
|
|
||||||
func ReverseSlice(slice interface{}) //反转切片
|
|
||||||
func Reduce(slice, function, zero interface{}) interface{} //切片reduce操作, 函数签名:func(index int, value1, value2 interface{}) interface{}
|
|
||||||
func Shuffle(slice interface{}) interface{} //创建一个被打乱值的切片
|
|
||||||
func Some(slice, function interface{}) bool //slice中任意一个元素都符合函数条件时返回true, 否则返回false. 函数签名:func(index int, value interface{}) bool
|
|
||||||
func SortByField(slice interface{}, field string, sortType ...string) error //对struct切片进行排序
|
|
||||||
func StringSlice(slice interface{}) []string //转为string切片
|
|
||||||
func Unique(slice interface{}) interface{} //去重切片
|
|
||||||
func Union(slices ...interface{}) interface{} //slice并集, 去重
|
|
||||||
func UpdateByIndex(slice interface{}, index int, value interface{}) (interface{}, error) //在切片中index位置更新value
|
|
||||||
func Without(slice interface{}, values ...interface{}) interface{} //slice去除values
|
|
||||||
func GroupBy(slice, function interface{}) (interface{}, interface{}) //根据函数function的逻辑分slice为两组slice
|
|
||||||
func Count(slice, function interface{}) int
|
|
||||||
```
|
|
||||||
|
|
||||||
### 11. strutil字符串处理包
|
|
||||||
|
|
||||||
- 字符串操作相关函数
|
|
||||||
- 导入包:import "github.com/duke-git/lancet/strutil"
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/strutil"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
str := "Foo-Bar"
|
|
||||||
camelCaseStr := strutil.CamelCase(str)
|
|
||||||
fmt.Println(camelCaseStr) //fooBar
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- 函数列表:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func After(s, char string) string //截取字符串中char第一次出现之后的字符串
|
|
||||||
func AfterLast(s, char string) string //截取字符串中char最后一次出现之后的字符串
|
|
||||||
func Before(s, char string) string //截取字符串中char第一次出现之前的字符串
|
|
||||||
func BeforeLast(s, char string) string //截取字符串中char最后一次出现之前的字符串
|
|
||||||
func CamelCase(s string) string //字符串转为cameCase, "foo bar" -> "fooBar"
|
|
||||||
func Capitalize(s string) string //字符串转为Capitalize, "fOO" -> "Foo"
|
|
||||||
func IsString(v interface{}) bool //判断是否是字符串
|
|
||||||
func KebabCase(s string) string //字符串转为KebabCase, "foo_Bar" -> "foo-bar"
|
|
||||||
func UpperFirst(s string) string //字符串的第一个字母转为大写字母
|
|
||||||
func LowerFirst(s string) string //字符串的第一个字母转为小写字母
|
|
||||||
func PadEnd(source string, size int, padStr string) string //字符串末尾填充size个字符
|
|
||||||
func PadStart(source string, size int, padStr string) string//字符串开头填充size个字符
|
|
||||||
func ReverseStr(s string) string //字符串逆序
|
|
||||||
func Wrap(str string, wrapWith string) string //包裹字符串 Wrap("abc", "*") -> *abc*.
|
|
||||||
func Unwrap(str string, wrapToken string) string //解包裹字符串 Wrap("*abc*", "*") -> abc.
|
|
||||||
func SnakeCase(s string) string //字符串转为SnakeCase, "fooBar" -> "foo_bar"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 12. system系统包
|
|
||||||
|
|
||||||
- 包含一些操作系统,运行时,shell命令执行的函数.
|
|
||||||
- Usage: import "github.com/duke-git/lancet/system".
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/system"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
envFoo := system.GetOsEnv("foo")
|
|
||||||
fmt.Println(envFoo)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- Function list:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func IsWindows() bool //判断操作系统是windows
|
|
||||||
func IsLinux() bool //判断操作系统是linux
|
|
||||||
func IsMac() bool //判断操作系统是macos
|
|
||||||
func GetOsEnv(key string) string //获取名称为key的环境变量
|
|
||||||
func SetOsEnv(key, value string) error //设置环境变量
|
|
||||||
func RemoveOsEnv(key string) error //删除指定key的环境变量
|
|
||||||
func CompareOsEnv(key, comparedEnv string) bool //获取名称为key的环境变量并和comparedEnv比较
|
|
||||||
func ExecCommand(command string) (stdout, stderr string, err error) //执行shell命令(/bin/bash)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 13. validator验证器包
|
|
||||||
|
|
||||||
- 数据校验相关函数
|
|
||||||
- 导入包:import "github.com/duke-git/lancet/validator"
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"github.com/duke-git/lancet/validator"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
str := "Foo-Bar"
|
|
||||||
isAlpha := validator.IsAlpha(str)
|
|
||||||
fmt.Println(isAlpha) //false
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- 函数列表:
|
|
||||||
|
|
||||||
```go
|
|
||||||
func ContainChinese(s string) bool //判断字符串中是否含有中文字符
|
|
||||||
func IsAlpha(s string) bool //判断字符串是否只含有字母
|
|
||||||
func IsBase64(base64 string) bool //判断字符串是base64
|
|
||||||
func IsAllUpper(str string) bool //断字符串是否全是大写字母
|
|
||||||
func IsAllLower(str string) bool //断字符串是否全是小写字母
|
|
||||||
func ContainUpper(str string) bool //判断字符串是否包含大写字母
|
|
||||||
func ContainLower(str string) bool //判断字符串是否包含小写字母
|
|
||||||
func ContainLetter(str string) bool //判断字符串是否包含字母
|
|
||||||
func IsJSON(str string) bool //判断字符串是否是JSON
|
|
||||||
func IsChineseMobile(mobileNum string) bool //判断字符串是否是手机号
|
|
||||||
func IsChineseIdNum(id string) bool //判断字符串是否是身份证号
|
|
||||||
func IsChinesePhone(phone string) bool //判断字符串是否是座机电话号码
|
|
||||||
func IsCreditCard(creditCart string) bool //判断字符串是否是信用卡
|
|
||||||
func IsDns(dns string) bool //判断字符串是否是DNS
|
|
||||||
func IsEmail(email string) bool //判断字符串是否是邮箱
|
|
||||||
func IsEmptyString(s string) bool //判断字符串是否为空
|
|
||||||
func IsFloatStr(s string) bool //判断字符串是否可以转成float
|
|
||||||
func IsNumberStr(s string) bool //判断字符串是否可以转成数字
|
|
||||||
func IsRegexMatch(s, regex string) bool //判断字符串是否match正则表达式
|
|
||||||
func IsIntStr(s string) bool //判断字符串是否可以转成整数
|
|
||||||
func IsIp(ipstr string) bool //判断字符串是否是ip
|
|
||||||
func IsIpV4(ipstr string) bool //判断字符串是否是ipv4
|
|
||||||
func IsIpV6(ipstr string) bool //判断字符串是否是ipv6
|
|
||||||
func IsStrongPassword(password string, length int) bool //判断字符串是否是强密码(大小写字母+数字+特殊字符)
|
|
||||||
func IsUrl(str string) bool //判断字符串是否是url
|
|
||||||
func IsWeakPassword(password string) bool //判断字符串是否是弱密码(只有字母或数字)
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -6,9 +6,12 @@ package convertor
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/binary"
|
||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -21,14 +24,44 @@ func ToBool(s string) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ToBytes convert interface to bytes
|
// ToBytes convert interface to bytes
|
||||||
func ToBytes(data interface{}) ([]byte, error) {
|
func ToBytes(value interface{}) ([]byte, error) {
|
||||||
var buf bytes.Buffer
|
v := reflect.ValueOf(value)
|
||||||
enc := gob.NewEncoder(&buf)
|
|
||||||
err := enc.Encode(data)
|
switch value.(type) {
|
||||||
if err != nil {
|
case int, int8, int16, int32, int64:
|
||||||
return nil, err
|
number := v.Int()
|
||||||
|
buf := bytes.NewBuffer([]byte{})
|
||||||
|
buf.Reset()
|
||||||
|
err := binary.Write(buf, binary.BigEndian, number)
|
||||||
|
return buf.Bytes(), err
|
||||||
|
case uint, uint8, uint16, uint32, uint64:
|
||||||
|
number := v.Uint()
|
||||||
|
buf := bytes.NewBuffer([]byte{})
|
||||||
|
buf.Reset()
|
||||||
|
err := binary.Write(buf, binary.BigEndian, number)
|
||||||
|
return buf.Bytes(), err
|
||||||
|
case float32:
|
||||||
|
number := float32(v.Float())
|
||||||
|
bits := math.Float32bits(number)
|
||||||
|
bytes := make([]byte, 4)
|
||||||
|
binary.BigEndian.PutUint32(bytes, bits)
|
||||||
|
return bytes, nil
|
||||||
|
case float64:
|
||||||
|
number := v.Float()
|
||||||
|
bits := math.Float64bits(number)
|
||||||
|
bytes := make([]byte, 8)
|
||||||
|
binary.BigEndian.PutUint64(bytes, bits)
|
||||||
|
return bytes, nil
|
||||||
|
case bool:
|
||||||
|
return strconv.AppendBool([]byte{}, v.Bool()), nil
|
||||||
|
case string:
|
||||||
|
return []byte(v.String()), nil
|
||||||
|
case []byte:
|
||||||
|
return v.Bytes(), nil
|
||||||
|
default:
|
||||||
|
newValue, err := json.Marshal(value)
|
||||||
|
return newValue, err
|
||||||
}
|
}
|
||||||
return buf.Bytes(), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToChar convert string to char slice
|
// ToChar convert string to char slice
|
||||||
@@ -198,3 +231,91 @@ func ColorRGBToHex(red, green, blue int) string {
|
|||||||
|
|
||||||
return "#" + r + g + b
|
return "#" + r + g + b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToChannel convert a array of elements to a read-only channels
|
||||||
|
func ToChannel(array []interface{}) <-chan interface{} {
|
||||||
|
ch := make(chan interface{})
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for _, item := range array {
|
||||||
|
ch <- item
|
||||||
|
}
|
||||||
|
close(ch)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncodeByte encode data to byte
|
||||||
|
func EncodeByte(data interface{}) ([]byte, error) {
|
||||||
|
buffer := bytes.NewBuffer(nil)
|
||||||
|
encoder := gob.NewEncoder(buffer)
|
||||||
|
err := encoder.Encode(data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return buffer.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecodeByte decode byte data to target object
|
||||||
|
func DecodeByte(data []byte, target interface{}) error {
|
||||||
|
buffer := bytes.NewBuffer(data)
|
||||||
|
decoder := gob.NewDecoder(buffer)
|
||||||
|
return decoder.Decode(target)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepClone creates a deep copy of passed item.
|
||||||
|
// can't clone unexported field of struct
|
||||||
|
func DeepClone(src interface{}) interface{} {
|
||||||
|
c := cloner{
|
||||||
|
ptrs: map[reflect.Type]map[uintptr]reflect.Value{},
|
||||||
|
}
|
||||||
|
result := c.clone(reflect.ValueOf(src))
|
||||||
|
if result.Kind() == reflect.Invalid {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.Interface()
|
||||||
|
}
|
||||||
|
|
||||||
|
// CopyProperties copies each field from the source into the destination. It recursively copies struct pointers and interfaces that contain struct pointers.
|
||||||
|
func CopyProperties(dst, src interface{}) (err error) {
|
||||||
|
defer func() {
|
||||||
|
if e := recover(); e != nil {
|
||||||
|
err = errors.New(fmt.Sprintf("%v", e))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
dstType, dstValue := reflect.TypeOf(dst), reflect.ValueOf(dst)
|
||||||
|
srcType, srcValue := reflect.TypeOf(src), reflect.ValueOf(src)
|
||||||
|
|
||||||
|
if dstType.Kind() != reflect.Ptr || dstType.Elem().Kind() != reflect.Struct {
|
||||||
|
return errors.New("CopyProperties: param dst should be struct pointer")
|
||||||
|
}
|
||||||
|
|
||||||
|
if srcType.Kind() == reflect.Ptr {
|
||||||
|
srcType, srcValue = srcType.Elem(), srcValue.Elem()
|
||||||
|
}
|
||||||
|
if srcType.Kind() != reflect.Struct {
|
||||||
|
return errors.New("CopyProperties: param src should be a struct or struct pointer")
|
||||||
|
}
|
||||||
|
|
||||||
|
dstType, dstValue = dstType.Elem(), dstValue.Elem()
|
||||||
|
|
||||||
|
propertyNums := dstType.NumField()
|
||||||
|
|
||||||
|
for i := 0; i < propertyNums; i++ {
|
||||||
|
property := dstType.Field(i)
|
||||||
|
propertyValue := srcValue.FieldByName(property.Name)
|
||||||
|
|
||||||
|
if !propertyValue.IsValid() || property.Type != propertyValue.Type() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if dstValue.Field(i).CanSet() {
|
||||||
|
dstValue.Field(i).Set(propertyValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
216
convertor/convertor_internal.go
Normal file
216
convertor/convertor_internal.go
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
// Copyright 2023 dudaodong@gmail.com. All rights reserved.
|
||||||
|
// Use of this source code is governed by MIT license
|
||||||
|
|
||||||
|
// Package convertor implements some functions to convert data.
|
||||||
|
package convertor
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
type cloner struct {
|
||||||
|
ptrs map[reflect.Type]map[uintptr]reflect.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
// clone return a duplicate of passed item.
|
||||||
|
func (c *cloner) clone(v reflect.Value) reflect.Value {
|
||||||
|
switch v.Kind() {
|
||||||
|
case reflect.Invalid:
|
||||||
|
return reflect.ValueOf(nil)
|
||||||
|
|
||||||
|
// bool
|
||||||
|
case reflect.Bool:
|
||||||
|
return reflect.ValueOf(v.Bool())
|
||||||
|
|
||||||
|
//int
|
||||||
|
case reflect.Int:
|
||||||
|
return reflect.ValueOf(int(v.Int()))
|
||||||
|
case reflect.Int8:
|
||||||
|
return reflect.ValueOf(int8(v.Int()))
|
||||||
|
case reflect.Int16:
|
||||||
|
return reflect.ValueOf(int16(v.Int()))
|
||||||
|
case reflect.Int32:
|
||||||
|
return reflect.ValueOf(int32(v.Int()))
|
||||||
|
case reflect.Int64:
|
||||||
|
return reflect.ValueOf(v.Int())
|
||||||
|
|
||||||
|
// uint
|
||||||
|
case reflect.Uint:
|
||||||
|
return reflect.ValueOf(uint(v.Uint()))
|
||||||
|
case reflect.Uint8:
|
||||||
|
return reflect.ValueOf(uint8(v.Uint()))
|
||||||
|
case reflect.Uint16:
|
||||||
|
return reflect.ValueOf(uint16(v.Uint()))
|
||||||
|
case reflect.Uint32:
|
||||||
|
return reflect.ValueOf(uint32(v.Uint()))
|
||||||
|
case reflect.Uint64:
|
||||||
|
return reflect.ValueOf(v.Uint())
|
||||||
|
|
||||||
|
// float
|
||||||
|
case reflect.Float32:
|
||||||
|
return reflect.ValueOf(float32(v.Float()))
|
||||||
|
case reflect.Float64:
|
||||||
|
return reflect.ValueOf(v.Float())
|
||||||
|
|
||||||
|
// complex
|
||||||
|
case reflect.Complex64:
|
||||||
|
return reflect.ValueOf(complex64(v.Complex()))
|
||||||
|
case reflect.Complex128:
|
||||||
|
return reflect.ValueOf(v.Complex())
|
||||||
|
|
||||||
|
// string
|
||||||
|
case reflect.String:
|
||||||
|
return reflect.ValueOf(v.String())
|
||||||
|
|
||||||
|
// array
|
||||||
|
case reflect.Array, reflect.Slice:
|
||||||
|
return c.cloneArray(v)
|
||||||
|
|
||||||
|
// map
|
||||||
|
case reflect.Map:
|
||||||
|
return c.cloneMap(v)
|
||||||
|
|
||||||
|
// Ptr
|
||||||
|
case reflect.Ptr:
|
||||||
|
return c.clonePtr(v)
|
||||||
|
|
||||||
|
// struct
|
||||||
|
case reflect.Struct:
|
||||||
|
return c.cloneStruct(v)
|
||||||
|
|
||||||
|
// func
|
||||||
|
case reflect.Func:
|
||||||
|
return v
|
||||||
|
|
||||||
|
// interface
|
||||||
|
case reflect.Interface:
|
||||||
|
return c.clone(v.Elem())
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return reflect.Zero(v.Type())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cloner) cloneArray(v reflect.Value) reflect.Value {
|
||||||
|
if v.IsNil() {
|
||||||
|
return reflect.Zero(v.Type())
|
||||||
|
}
|
||||||
|
|
||||||
|
arr := reflect.MakeSlice(v.Type(), v.Len(), v.Len())
|
||||||
|
|
||||||
|
for i := 0; i < v.Len(); i++ {
|
||||||
|
val := c.clone(v.Index(i))
|
||||||
|
|
||||||
|
if val.IsValid() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
item := arr.Index(i)
|
||||||
|
if !item.CanSet() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
item.Set(val.Convert(item.Type()))
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cloner) cloneMap(v reflect.Value) reflect.Value {
|
||||||
|
if v.IsNil() {
|
||||||
|
return reflect.Zero(v.Type())
|
||||||
|
}
|
||||||
|
|
||||||
|
clonedMap := reflect.MakeMap(v.Type())
|
||||||
|
|
||||||
|
for _, key := range v.MapKeys() {
|
||||||
|
value := v.MapIndex(key)
|
||||||
|
clonedKey := c.clone(key)
|
||||||
|
clonedValue := c.clone(value)
|
||||||
|
|
||||||
|
if !isNillable(clonedKey) || !clonedKey.IsNil() {
|
||||||
|
clonedKey = clonedKey.Convert(key.Type())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNillable(clonedValue) || !clonedValue.IsNil()) && clonedValue.IsValid() {
|
||||||
|
clonedValue = clonedValue.Convert(value.Type())
|
||||||
|
}
|
||||||
|
|
||||||
|
if !clonedValue.IsValid() {
|
||||||
|
clonedValue = reflect.Zero(clonedMap.Type().Elem())
|
||||||
|
}
|
||||||
|
|
||||||
|
clonedMap.SetMapIndex(clonedKey, clonedValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
return clonedMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func isNillable(v reflect.Value) bool {
|
||||||
|
switch v.Kind() {
|
||||||
|
case reflect.Chan, reflect.Interface, reflect.Ptr, reflect.Func:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cloner) clonePtr(v reflect.Value) reflect.Value {
|
||||||
|
if v.IsNil() {
|
||||||
|
return reflect.Zero(v.Type())
|
||||||
|
}
|
||||||
|
|
||||||
|
var newVal reflect.Value
|
||||||
|
|
||||||
|
if v.Elem().CanAddr() {
|
||||||
|
ptrs, exists := c.ptrs[v.Type()]
|
||||||
|
if exists {
|
||||||
|
if newVal, exists := ptrs[v.Elem().UnsafeAddr()]; exists {
|
||||||
|
return newVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newVal = c.clone(v.Elem())
|
||||||
|
|
||||||
|
if v.Elem().CanAddr() {
|
||||||
|
ptrs, exists := c.ptrs[v.Type()]
|
||||||
|
if exists {
|
||||||
|
if newVal, exists := ptrs[v.Elem().UnsafeAddr()]; exists {
|
||||||
|
return newVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clonedPtr := reflect.New(newVal.Type())
|
||||||
|
clonedPtr.Elem().Set(newVal)
|
||||||
|
|
||||||
|
return clonedPtr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cloner) cloneStruct(v reflect.Value) reflect.Value {
|
||||||
|
clonedStructPtr := reflect.New(v.Type())
|
||||||
|
clonedStruct := clonedStructPtr.Elem()
|
||||||
|
|
||||||
|
if v.CanAddr() {
|
||||||
|
ptrs := c.ptrs[clonedStructPtr.Type()]
|
||||||
|
if ptrs == nil {
|
||||||
|
ptrs = make(map[uintptr]reflect.Value)
|
||||||
|
c.ptrs[clonedStructPtr.Type()] = ptrs
|
||||||
|
}
|
||||||
|
ptrs[v.UnsafeAddr()] = clonedStructPtr
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < v.NumField(); i++ {
|
||||||
|
newStructValue := clonedStruct.Field(i)
|
||||||
|
if !newStructValue.CanSet() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clonedVal := c.clone(v.Field(i))
|
||||||
|
if !clonedVal.IsValid() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
newStructValue.Set(clonedVal.Convert(newStructValue.Type()))
|
||||||
|
}
|
||||||
|
|
||||||
|
return clonedStruct
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package convertor
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/duke-git/lancet/internal"
|
"github.com/duke-git/lancet/internal"
|
||||||
@@ -24,8 +25,8 @@ func TestToChar(t *testing.T) {
|
|||||||
func TestToBool(t *testing.T) {
|
func TestToBool(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestToBool")
|
assert := internal.NewAssert(t, "TestToBool")
|
||||||
|
|
||||||
cases := []string{"true", "True", "false", "False", "0", "1", "123"}
|
cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
|
||||||
expected := []bool{true, true, false, false, false, true, false}
|
expected := []bool{true, true, true, false, false, false, false, false, false}
|
||||||
|
|
||||||
for i := 0; i < len(cases); i++ {
|
for i := 0; i < len(cases); i++ {
|
||||||
actual, _ := ToBool(cases[i])
|
actual, _ := ToBool(cases[i])
|
||||||
@@ -42,14 +43,21 @@ func TestToBytes(t *testing.T) {
|
|||||||
"1",
|
"1",
|
||||||
}
|
}
|
||||||
expected := [][]byte{
|
expected := [][]byte{
|
||||||
{3, 4, 0, 0},
|
{0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
{3, 2, 0, 0},
|
{102, 97, 108, 115, 101},
|
||||||
{4, 12, 0, 1, 49},
|
{49},
|
||||||
}
|
}
|
||||||
for i := 0; i < len(cases); i++ {
|
for i := 0; i < len(cases); i++ {
|
||||||
actual, _ := ToBytes(cases[i])
|
actual, _ := ToBytes(cases[i])
|
||||||
assert.Equal(expected[i], actual)
|
assert.Equal(expected[i], actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bytesData, err := ToBytes("abc")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
assert.Equal("abc", ToString(bytesData))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestToInt(t *testing.T) {
|
func TestToInt(t *testing.T) {
|
||||||
@@ -171,3 +179,132 @@ func TestColorRGBToHex(t *testing.T) {
|
|||||||
assert := internal.NewAssert(t, "TestColorRGBToHex")
|
assert := internal.NewAssert(t, "TestColorRGBToHex")
|
||||||
assert.Equal(expected, colorHex)
|
assert.Equal(expected, colorHex)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestToChannel(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToChannel")
|
||||||
|
|
||||||
|
ch := ToChannel([]interface{}{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 TestEncodeByte(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEncodeByte")
|
||||||
|
|
||||||
|
byteData, _ := EncodeByte("abc")
|
||||||
|
expected := []byte{6, 12, 0, 3, 97, 98, 99}
|
||||||
|
|
||||||
|
assert.Equal(expected, byteData)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDecodeByte(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestDecodeByte")
|
||||||
|
|
||||||
|
var obj string
|
||||||
|
byteData := []byte{6, 12, 0, 3, 97, 98, 99}
|
||||||
|
DecodeByte(byteData, &obj)
|
||||||
|
assert.Equal("abc", obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDeepClone(t *testing.T) {
|
||||||
|
// assert := internal.NewAssert(t, "TestDeepClone")
|
||||||
|
|
||||||
|
type Struct struct {
|
||||||
|
Str string
|
||||||
|
Int int
|
||||||
|
Float float64
|
||||||
|
Bool bool
|
||||||
|
Nil interface{}
|
||||||
|
unexported string
|
||||||
|
}
|
||||||
|
|
||||||
|
cases := []interface{}{
|
||||||
|
true,
|
||||||
|
1,
|
||||||
|
0.1,
|
||||||
|
map[string]int{
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
},
|
||||||
|
&Struct{
|
||||||
|
Str: "test",
|
||||||
|
Int: 1,
|
||||||
|
Float: 0.1,
|
||||||
|
Bool: true,
|
||||||
|
Nil: nil,
|
||||||
|
// unexported: "can't be cloned",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, item := range cases {
|
||||||
|
cloned := DeepClone(item)
|
||||||
|
|
||||||
|
t.Log(cloned)
|
||||||
|
if &cloned == &item {
|
||||||
|
t.Fatalf("[TestDeepClone case #%d failed]: equal pointer", i)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(item, cloned) {
|
||||||
|
t.Fatalf("[TestDeepClone case #%d failed] unequal objects", i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCopyProperties(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestCopyProperties")
|
||||||
|
|
||||||
|
type Address struct {
|
||||||
|
Country string
|
||||||
|
ZipCode string
|
||||||
|
}
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
Name string
|
||||||
|
Age int
|
||||||
|
Role string
|
||||||
|
Addr Address
|
||||||
|
Hobbys []string
|
||||||
|
salary int
|
||||||
|
}
|
||||||
|
|
||||||
|
type Employee struct {
|
||||||
|
Name string
|
||||||
|
Age int
|
||||||
|
Role string
|
||||||
|
Addr Address
|
||||||
|
Hobbys []string
|
||||||
|
salary int
|
||||||
|
}
|
||||||
|
|
||||||
|
user := User{Name: "user001", Age: 10, Role: "Admin", Addr: Address{Country: "CN", ZipCode: "001"}, Hobbys: []string{"a", "b"}, salary: 1000}
|
||||||
|
|
||||||
|
employee1 := Employee{}
|
||||||
|
|
||||||
|
err := CopyProperties(&employee1, &user)
|
||||||
|
|
||||||
|
assert.IsNil(err)
|
||||||
|
assert.Equal("user001", employee1.Name)
|
||||||
|
assert.Equal("Admin", employee1.Role)
|
||||||
|
assert.Equal("CN", employee1.Addr.Country)
|
||||||
|
assert.Equal(0, employee1.salary)
|
||||||
|
|
||||||
|
employee2 := Employee{Name: "employee001", Age: 20, Role: "User",
|
||||||
|
Addr: Address{Country: "UK", ZipCode: "002"}, salary: 500}
|
||||||
|
|
||||||
|
err = CopyProperties(&employee2, &user)
|
||||||
|
|
||||||
|
assert.IsNil(err)
|
||||||
|
assert.Equal("user001", employee2.Name)
|
||||||
|
assert.Equal("Admin", employee2.Role)
|
||||||
|
assert.Equal("CN", employee2.Addr.Country)
|
||||||
|
assert.Equal(500, employee2.salary)
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,14 +17,23 @@ import (
|
|||||||
// AesEcbEncrypt encrypt data with key use AES ECB algorithm
|
// AesEcbEncrypt encrypt data with key use AES ECB algorithm
|
||||||
// len(key) should be 16, 24 or 32
|
// len(key) should be 16, 24 or 32
|
||||||
func AesEcbEncrypt(data, key []byte) []byte {
|
func AesEcbEncrypt(data, key []byte) []byte {
|
||||||
cipher, _ := aes.NewCipher(generateAesKey(key))
|
size := len(key)
|
||||||
|
if size != 16 && size != 24 && size != 32 {
|
||||||
|
panic("key length shoud be 16 or 24 or 32")
|
||||||
|
}
|
||||||
|
|
||||||
|
cipher, _ := aes.NewCipher(generateAesKey(key, size))
|
||||||
length := (len(data) + aes.BlockSize) / aes.BlockSize
|
length := (len(data) + aes.BlockSize) / aes.BlockSize
|
||||||
|
|
||||||
plain := make([]byte, length*aes.BlockSize)
|
plain := make([]byte, length*aes.BlockSize)
|
||||||
|
|
||||||
copy(plain, data)
|
copy(plain, data)
|
||||||
|
|
||||||
pad := byte(len(plain) - len(data))
|
pad := byte(len(plain) - len(data))
|
||||||
for i := len(data); i < len(plain); i++ {
|
for i := len(data); i < len(plain); i++ {
|
||||||
plain[i] = pad
|
plain[i] = pad
|
||||||
}
|
}
|
||||||
|
|
||||||
encrypted := make([]byte, len(plain))
|
encrypted := make([]byte, len(plain))
|
||||||
for bs, be := 0, cipher.BlockSize(); bs <= len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
|
for bs, be := 0, cipher.BlockSize(); bs <= len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
|
||||||
cipher.Encrypt(encrypted[bs:be], plain[bs:be])
|
cipher.Encrypt(encrypted[bs:be], plain[bs:be])
|
||||||
@@ -36,9 +45,14 @@ func AesEcbEncrypt(data, key []byte) []byte {
|
|||||||
// AesEcbDecrypt decrypt data with key use AES ECB algorithm
|
// AesEcbDecrypt decrypt data with key use AES ECB algorithm
|
||||||
// len(key) should be 16, 24 or 32
|
// len(key) should be 16, 24 or 32
|
||||||
func AesEcbDecrypt(encrypted, key []byte) []byte {
|
func AesEcbDecrypt(encrypted, key []byte) []byte {
|
||||||
cipher, _ := aes.NewCipher(generateAesKey(key))
|
size := len(key)
|
||||||
|
if size != 16 && size != 24 && size != 32 {
|
||||||
|
panic("key length shoud be 16 or 24 or 32")
|
||||||
|
}
|
||||||
|
|
||||||
|
cipher, _ := aes.NewCipher(generateAesKey(key, size))
|
||||||
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 +68,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 +87,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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ package cryptor
|
|||||||
|
|
||||||
import "bytes"
|
import "bytes"
|
||||||
|
|
||||||
func generateAesKey(key []byte) []byte {
|
func generateAesKey(key []byte, size int) []byte {
|
||||||
genKey := make([]byte, 16)
|
aesKey := make([]byte, size)
|
||||||
copy(genKey, key)
|
copy(aesKey, key)
|
||||||
for i := 16; i < len(key); {
|
for i := size; i < len(key); {
|
||||||
for j := 0; j < 16 && i < len(key); j, i = j+1, i+1 {
|
for j := 0; j < size && i < len(key); j, i = j+1, i+1 {
|
||||||
genKey[j] ^= key[i]
|
aesKey[j] ^= key[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return genKey
|
return aesKey
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateDesKey(key []byte) []byte {
|
func generateDesKey(key []byte) []byte {
|
||||||
@@ -19,10 +19,12 @@ func DesEcbEncrypt(data, key []byte) []byte {
|
|||||||
length := (len(data) + des.BlockSize) / des.BlockSize
|
length := (len(data) + des.BlockSize) / des.BlockSize
|
||||||
plain := make([]byte, length*des.BlockSize)
|
plain := make([]byte, length*des.BlockSize)
|
||||||
copy(plain, data)
|
copy(plain, data)
|
||||||
|
|
||||||
pad := byte(len(plain) - len(data))
|
pad := byte(len(plain) - len(data))
|
||||||
for i := len(data); i < len(plain); i++ {
|
for i := len(data); i < len(plain); i++ {
|
||||||
plain[i] = pad
|
plain[i] = pad
|
||||||
}
|
}
|
||||||
|
|
||||||
encrypted := make([]byte, len(plain))
|
encrypted := make([]byte, len(plain))
|
||||||
for bs, be := 0, cipher.BlockSize(); bs <= len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
|
for bs, be := 0, cipher.BlockSize(); bs <= len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
|
||||||
cipher.Encrypt(encrypted[bs:be], plain[bs:be])
|
cipher.Encrypt(encrypted[bs:be], plain[bs:be])
|
||||||
@@ -36,7 +38,7 @@ func DesEcbEncrypt(data, key []byte) []byte {
|
|||||||
func DesEcbDecrypt(encrypted, key []byte) []byte {
|
func DesEcbDecrypt(encrypted, key []byte) []byte {
|
||||||
cipher, _ := des.NewCipher(generateDesKey(key))
|
cipher, _ := des.NewCipher(generateDesKey(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])
|
||||||
}
|
}
|
||||||
@@ -53,12 +55,17 @@ 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, des.BlockSize+len(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)
|
||||||
|
|
||||||
encrypted := make([]byte, len(data))
|
|
||||||
blockMode.CryptBlocks(encrypted, data)
|
|
||||||
return encrypted
|
return encrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,12 +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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +114,7 @@ func DesCfbEncrypt(data, key []byte) []byte {
|
|||||||
|
|
||||||
stream := cipher.NewCFBEncrypter(block, iv)
|
stream := cipher.NewCFBEncrypter(block, iv)
|
||||||
stream.XORKeyStream(encrypted[des.BlockSize:], data)
|
stream.XORKeyStream(encrypted[des.BlockSize:], data)
|
||||||
|
|
||||||
return encrypted
|
return encrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,6 +130,7 @@ func DesCfbDecrypt(encrypted, key []byte) []byte {
|
|||||||
|
|
||||||
stream := cipher.NewCFBDecrypter(block, iv)
|
stream := cipher.NewCFBDecrypter(block, iv)
|
||||||
stream.XORKeyStream(encrypted, encrypted)
|
stream.XORKeyStream(encrypted, encrypted)
|
||||||
|
|
||||||
return encrypted
|
return encrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,6 +150,7 @@ func DesOfbEncrypt(data, key []byte) []byte {
|
|||||||
|
|
||||||
stream := cipher.NewOFB(block, iv)
|
stream := cipher.NewOFB(block, iv)
|
||||||
stream.XORKeyStream(encrypted[des.BlockSize:], data)
|
stream.XORKeyStream(encrypted[des.BlockSize:], data)
|
||||||
|
|
||||||
return encrypted
|
return encrypted
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,6 +173,6 @@ func DesOfbDecrypt(data, key []byte) []byte {
|
|||||||
mode.XORKeyStream(decrypted, data)
|
mode.XORKeyStream(decrypted, data)
|
||||||
|
|
||||||
decrypted = pkcs7UnPadding(decrypted)
|
decrypted = pkcs7UnPadding(decrypted)
|
||||||
return decrypted
|
|
||||||
|
|
||||||
|
return decrypted
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ import (
|
|||||||
|
|
||||||
// GenerateRsaKey make a rsa private key, and return key file name
|
// GenerateRsaKey make a rsa private key, and return key file name
|
||||||
// Generated key file is `rsa_private.pem` and `rsa_public.pem` in current path
|
// Generated key file is `rsa_private.pem` and `rsa_public.pem` in current path
|
||||||
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) {
|
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error {
|
||||||
// private key
|
// private key
|
||||||
privateKey, err := rsa.GenerateKey(rand.Reader, keySize)
|
privateKey, err := rsa.GenerateKey(rand.Reader, keySize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
derText := x509.MarshalPKCS1PrivateKey(privateKey)
|
derText := x509.MarshalPKCS1PrivateKey(privateKey)
|
||||||
@@ -41,7 +41,7 @@ func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) {
|
|||||||
|
|
||||||
derpText, err := x509.MarshalPKIXPublicKey(&publicKey)
|
derpText, err := x509.MarshalPKIXPublicKey(&publicKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
block = pem.Block{
|
block = pem.Block{
|
||||||
@@ -52,10 +52,12 @@ func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) {
|
|||||||
//file,err = os.Create("rsa_public.pem")
|
//file,err = os.Create("rsa_public.pem")
|
||||||
file, err = os.Create(pubKeyFile)
|
file, err = os.Create(pubKeyFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return err
|
||||||
}
|
}
|
||||||
pem.Encode(file, &block)
|
pem.Encode(file, &block)
|
||||||
file.Close()
|
file.Close()
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RsaEncrypt encrypt data with ras algorithm
|
// RsaEncrypt encrypt data with ras algorithm
|
||||||
|
|||||||
@@ -7,7 +7,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestRsaEncrypt(t *testing.T) {
|
func TestRsaEncrypt(t *testing.T) {
|
||||||
GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
err := GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
|
if err != nil {
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
data := []byte("hello world")
|
data := []byte("hello world")
|
||||||
encrypted := RsaEncrypt(data, "rsa_public.pem")
|
encrypted := RsaEncrypt(data, "rsa_public.pem")
|
||||||
decrypted := RsaDecrypt(encrypted, "rsa_private.pem")
|
decrypted := RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
|
|||||||
60
datetime/conversion.go
Normal file
60
datetime/conversion.go
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
// Copyright 2021 dudaodong@gmail.com. All rights reserved.
|
||||||
|
// Use of this source code is governed by MIT license.
|
||||||
|
|
||||||
|
package datetime
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUnixNow return unix timestamp of current time
|
||||||
|
func NewUnixNow() *theTime {
|
||||||
|
return &theTime{unix: time.Now().Unix()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUnix return unix timestamp of specified time
|
||||||
|
func NewUnix(unix int64) *theTime {
|
||||||
|
return &theTime{unix: unix}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFormat return unix timestamp of specified time string, t should be "yyyy-mm-dd hh:mm:ss"
|
||||||
|
func NewFormat(t string) (*theTime, error) {
|
||||||
|
timeLayout := "2006-01-02 15:04:05"
|
||||||
|
loc := time.FixedZone("CST", 8*3600)
|
||||||
|
tt, err := time.ParseInLocation(timeLayout, t, loc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &theTime{unix: tt.Unix()}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewISO8601 return unix timestamp of specified iso8601 time string
|
||||||
|
func NewISO8601(iso8601 string) (*theTime, error) {
|
||||||
|
t, err := time.ParseInLocation(time.RFC3339, iso8601, time.UTC)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &theTime{unix: t.Unix()}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToUnix return unix timestamp
|
||||||
|
func (t *theTime) ToUnix() int64 {
|
||||||
|
return t.unix
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFormat return the time string 'yyyy-mm-dd hh:mm:ss' of unix time
|
||||||
|
func (t *theTime) ToFormat() string {
|
||||||
|
return time.Unix(t.unix, 0).Format("2006-01-02 15:04:05")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFormatForTpl return the time string which format is specified tpl
|
||||||
|
func (t *theTime) ToFormatForTpl(tpl string) string {
|
||||||
|
return time.Unix(t.unix, 0).Format(tpl)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFormatForTpl return iso8601 time string
|
||||||
|
func (t *theTime) ToIso8601() string {
|
||||||
|
return time.Unix(t.unix, 0).Format(time.RFC3339)
|
||||||
|
}
|
||||||
54
datetime/conversion_test.go
Normal file
54
datetime/conversion_test.go
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package datetime
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/duke-git/lancet/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestToUnix(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToUnix")
|
||||||
|
|
||||||
|
tm1 := NewUnixNow()
|
||||||
|
unixTimestamp := tm1.ToUnix()
|
||||||
|
tm2 := NewUnix(unixTimestamp)
|
||||||
|
|
||||||
|
assert.Equal(tm1, tm2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestToFormat(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToFormat")
|
||||||
|
|
||||||
|
tm, err := NewFormat("2022/03/18 17:04:05")
|
||||||
|
assert.IsNotNil(err)
|
||||||
|
|
||||||
|
tm, err = NewFormat("2022-03-18 17:04:05")
|
||||||
|
assert.IsNil(err)
|
||||||
|
|
||||||
|
t.Log("ToFormat -> ", tm.ToFormat())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestToFormatForTpl(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToFormatForTpl")
|
||||||
|
|
||||||
|
tm, err := NewFormat("2022/03/18 17:04:05")
|
||||||
|
assert.IsNotNil(err)
|
||||||
|
|
||||||
|
tm, err = NewFormat("2022-03-18 17:04:05")
|
||||||
|
assert.IsNil(err)
|
||||||
|
|
||||||
|
t.Log("ToFormatForTpl -> ", tm.ToFormatForTpl("2006/01/02 15:04:05"))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestToIso8601(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToIso8601")
|
||||||
|
|
||||||
|
tm, err := NewISO8601("2022-03-18 17:04:05")
|
||||||
|
assert.IsNotNil(err)
|
||||||
|
|
||||||
|
tm, err = NewISO8601("2006-01-02T15:04:05.999Z")
|
||||||
|
assert.IsNil(err)
|
||||||
|
|
||||||
|
t.Log("ToIso8601 -> ", tm.ToIso8601())
|
||||||
|
}
|
||||||
@@ -110,3 +110,73 @@ func FormatStrToTime(str, format string) (time.Time, error) {
|
|||||||
|
|
||||||
return time.Parse(v, str)
|
return time.Parse(v, str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BeginOfMinute return beginning minute time of day
|
||||||
|
func BeginOfMinute(t time.Time) time.Time {
|
||||||
|
y, m, d := t.Date()
|
||||||
|
return time.Date(y, m, d, t.Hour(), t.Minute(), 0, 0, t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndOfMinute return end minute time of day
|
||||||
|
func EndOfMinute(t time.Time) time.Time {
|
||||||
|
y, m, d := t.Date()
|
||||||
|
return time.Date(y, m, d, t.Hour(), t.Minute(), 59, int(time.Second-time.Nanosecond), t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// BeginOfHour return beginning hour time of day
|
||||||
|
func BeginOfHour(t time.Time) time.Time {
|
||||||
|
y, m, d := t.Date()
|
||||||
|
return time.Date(y, m, d, t.Hour(), 0, 0, 0, t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndOfHour return end hour time of day
|
||||||
|
func EndOfHour(t time.Time) time.Time {
|
||||||
|
y, m, d := t.Date()
|
||||||
|
return time.Date(y, m, d, t.Hour(), 59, 59, int(time.Second-time.Nanosecond), t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// BeginOfDay return beginning hour time of day
|
||||||
|
func BeginOfDay(t time.Time) time.Time {
|
||||||
|
y, m, d := t.Date()
|
||||||
|
return time.Date(y, m, d, 0, 0, 0, 0, t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndOfDay return end time of day
|
||||||
|
func EndOfDay(t time.Time) time.Time {
|
||||||
|
y, m, d := t.Date()
|
||||||
|
return time.Date(y, m, d, 23, 59, 59, int(time.Second-time.Nanosecond), t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// BeginOfWeek return beginning week, week begin from Sunday
|
||||||
|
func BeginOfWeek(t time.Time) time.Time {
|
||||||
|
y, m, d := t.AddDate(0, 0, 0-int(BeginOfDay(t).Weekday())).Date()
|
||||||
|
return time.Date(y, m, d, 0, 0, 0, 0, t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndOfWeek return end week time, week end with Saturday
|
||||||
|
func EndOfWeek(t time.Time) time.Time {
|
||||||
|
y, m, d := BeginOfWeek(t).AddDate(0, 0, 7).Add(-time.Nanosecond).Date()
|
||||||
|
return time.Date(y, m, d, 23, 59, 59, int(time.Second-time.Nanosecond), t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// BeginOfMonth return beginning of month
|
||||||
|
func BeginOfMonth(t time.Time) time.Time {
|
||||||
|
y, m, _ := t.Date()
|
||||||
|
return time.Date(y, m, 1, 0, 0, 0, 0, t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndOfMonth return end of month
|
||||||
|
func EndOfMonth(t time.Time) time.Time {
|
||||||
|
return BeginOfMonth(t).AddDate(0, 1, 0).Add(-time.Nanosecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BeginOfYear return beginning of year
|
||||||
|
func BeginOfYear(t time.Time) time.Time {
|
||||||
|
y, _, _ := t.Date()
|
||||||
|
return time.Date(y, time.January, 1, 0, 0, 0, 0, t.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndOfYear return end of year
|
||||||
|
func EndOfYear(t time.Time) time.Time {
|
||||||
|
return BeginOfYear(t).AddDate(1, 0, 0).Add(-time.Nanosecond)
|
||||||
|
}
|
||||||
|
|||||||
@@ -64,16 +64,6 @@ func TestGetNowDateTime(t *testing.T) {
|
|||||||
assert.Equal(expected, GetNowDateTime())
|
assert.Equal(expected, GetNowDateTime())
|
||||||
}
|
}
|
||||||
|
|
||||||
//todo
|
|
||||||
//func TestGetZeroHourTimestamp(t *testing.T) {
|
|
||||||
// ts := GetZeroHourTimestamp()
|
|
||||||
// expected := time.Now().UTC().Unix() - 8*3600
|
|
||||||
// if ts != expected {
|
|
||||||
// utils.LogFailedTestInfo(t, "GetZeroHourTimestamp", "", expected, ts)
|
|
||||||
// t.FailNow()
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
func TestFormatTimeToStr(t *testing.T) {
|
func TestFormatTimeToStr(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestFormatTimeToStr")
|
assert := internal.NewAssert(t, "TestFormatTimeToStr")
|
||||||
|
|
||||||
@@ -121,3 +111,123 @@ func TestFormatStrToTime(t *testing.T) {
|
|||||||
assert.Equal(expected, actual)
|
assert.Equal(expected, actual)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBeginOfMinute(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestBeginOfMinute")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 15, 15, 48, 0, 0, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := BeginOfMinute(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEndOfMinute(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEndOfMinute")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 15, 15, 48, 59, 999999999, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := EndOfMinute(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBeginOfHour(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestBeginOfHour")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 15, 15, 0, 0, 0, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := BeginOfHour(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEndOfHour(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEndOfHour")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 15, 15, 59, 59, 999999999, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := EndOfHour(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBeginOfDay(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestBeginOfDay")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 15, 0, 0, 0, 0, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := BeginOfDay(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEndOfDay(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEndOfDay")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 15, 23, 59, 59, 999999999, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := EndOfDay(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBeginOfWeek(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestBeginOfWeek")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 13, 0, 0, 0, 0, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := BeginOfWeek(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEndOfWeek(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEndOfWeek")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 19, 23, 59, 59, 999999999, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := EndOfWeek(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBeginOfMonth(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestBeginOfMonth")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 1, 0, 0, 0, 0, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := BeginOfMonth(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEndOfMonth(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEndOfMonth")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 2, 28, 23, 59, 59, 999999999, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := EndOfMonth(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBeginOfYear(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestBeginOfYear")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 1, 1, 0, 0, 0, 0, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := BeginOfYear(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEndOfYear(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEndOfYear")
|
||||||
|
|
||||||
|
expected := time.Date(2022, 12, 31, 23, 59, 59, 999999999, time.Local)
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
actual := EndOfYear(td)
|
||||||
|
|
||||||
|
assert.Equal(expected, actual)
|
||||||
|
}
|
||||||
|
|||||||
503
docs/convertor.md
Normal file
503
docs/convertor.md
Normal file
@@ -0,0 +1,503 @@
|
|||||||
|
# Convertor
|
||||||
|
|
||||||
|
Package convertor contains some functions for data type convertion.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/convertor/convertor.go](https://github.com/duke-git/lancet/blob/v1/convertor/convertor.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [ColorHexToRGB](#ColorHexToRGB)
|
||||||
|
- [ColorRGBToHex](#ColorRGBToHex)
|
||||||
|
- [ToBool](#ToBool)
|
||||||
|
- [ToBytes](#ToBytes)
|
||||||
|
- [ToChar](#ToChar)
|
||||||
|
- [ToChannel](#ToChannel)
|
||||||
|
- [ToFloat](#ToFloat)
|
||||||
|
- [ToInt](#ToInt)
|
||||||
|
- [ToJson](#ToJson)
|
||||||
|
- [ToString](#ToString)
|
||||||
|
- [StructToMap](#StructToMap)
|
||||||
|
- [EncodeByte](#EncodeByte)
|
||||||
|
- [DecodeByte](#DecodeByte)
|
||||||
|
- [DeepClone](#DeepClone)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="ColorHexToRGB">ColorHexToRGB</span>
|
||||||
|
|
||||||
|
<p>Convert color hex to color rgb.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ColorHexToRGB(colorHex string) (red, green, blue int)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
colorHex := "#003366"
|
||||||
|
r, g, b := ColorHexToRGB(colorHex)
|
||||||
|
fmt.Println(r, g, b) //0,51,102
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ColorRGBToHex">ColorRGBToHex</span>
|
||||||
|
|
||||||
|
<p>Convert color rgb to color hex.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ColorRGBToHex(red, green, blue int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := 0
|
||||||
|
g := 51
|
||||||
|
b := 102
|
||||||
|
colorHex := ColorRGBToHex(r, g, b)
|
||||||
|
|
||||||
|
fmt.Println(colorHex) //#003366
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToBool">ToBool</span>
|
||||||
|
|
||||||
|
<p>Convert string to a boolean value. Use strconv.ParseBool</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToBool(s string) (bool, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v1, _ := convertor.ToBool("1")
|
||||||
|
fmt.Println(v1) //true
|
||||||
|
|
||||||
|
v2, _ := convertor.ToBool("true")
|
||||||
|
fmt.Println(v2) //true
|
||||||
|
|
||||||
|
v3, _ := convertor.ToBool("True")
|
||||||
|
fmt.Println(v3) //true
|
||||||
|
|
||||||
|
v4, _ := convertor.ToBool("123")
|
||||||
|
fmt.Println(v4) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToBytes">ToBytes</span>
|
||||||
|
|
||||||
|
<p>Convert interface to byte slice.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToBytes(data interface{}) ([]byte, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
bytesData, err := convertor.ToBytes("0")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
fmt.Println(bytesData) //[]bytes{3, 4, 0, 0}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToChar">ToChar</span>
|
||||||
|
|
||||||
|
<p>Convert string to char slice.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToChar(s string) []string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
chars := convertor.ToChar("")
|
||||||
|
fmt.Println(chars) //[]string{""}
|
||||||
|
|
||||||
|
chars = convertor.ToChar("abc")
|
||||||
|
fmt.Println(chars) //[]string{"a", "b", "c"}
|
||||||
|
|
||||||
|
chars = convertor.ToChar("1 2#3")
|
||||||
|
fmt.Println(chars) //[]string{"1", " ", "2", "#", "3"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToChannel">ToChannel</span>
|
||||||
|
|
||||||
|
<p>Convert a collection of elements to a read-only channels.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToChannel(array []interface{}) <-chan interface{}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/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>
|
||||||
|
|
||||||
|
<p>Convert interface to a float64 value. If param is a invalid floatable, will return 0 and error. </p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToFloat(value interface{}) (float64, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v, err := convertor.ToFloat("")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err) //strconv.ParseFloat: parsing "": invalid syntax
|
||||||
|
}
|
||||||
|
fmt.Println(v) //0
|
||||||
|
|
||||||
|
v, _ = convertor.ToFloat("-.11")
|
||||||
|
fmt.Println(v) //-0.11
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToInt">ToInt</span>
|
||||||
|
|
||||||
|
<p>Convert interface to a int64 value. If param is a invalid intable, will return 0 and error. </p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToInt(value interface{}) (int64, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v, err := convertor.ToInt("")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err) //strconv.ParseInt: parsing "": invalid syntax
|
||||||
|
}
|
||||||
|
fmt.Println(v) //0
|
||||||
|
|
||||||
|
v, _ = convertor.ToFloat(1.12)
|
||||||
|
fmt.Println(v) //1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToJson">ToJson</span>
|
||||||
|
|
||||||
|
<p>Convert interface to json string. If param can't be converted, will return "" and error. </p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToJson(value interface{}) (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var aMap = map[string]int{"a": 1, "b": 2, "c": 3}
|
||||||
|
jsonStr, _ := convertor.ToJson(aMap)
|
||||||
|
fmt.Printf("%q", jsonStr) //"{\"a\":1,\"b\":2,\"c\":3}"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToString">ToString</span>
|
||||||
|
|
||||||
|
<p>Convert interface to string. </p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToString(value interface{}) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Printf("%q", convertor.ToString(1)) //"1"
|
||||||
|
fmt.Printf("%q", convertor.ToString(1.1)) //"1.1"
|
||||||
|
fmt.Printf("%q", convertor.ToString([]int{1, 2, 3})) //"[1,2,3]"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="StructToMap">StructToMap</span>
|
||||||
|
|
||||||
|
<p>Convert struct to map, only convert exported field, struct field tag `json` should be set.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func StructToMap(value interface{}) (map[string]interface{}, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type People struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
age int
|
||||||
|
}
|
||||||
|
p := People{
|
||||||
|
"test",
|
||||||
|
100,
|
||||||
|
}
|
||||||
|
pm, _ := convertor.StructToMap(p)
|
||||||
|
|
||||||
|
fmt.Printf("type: %T, value: %s", pm, pm) //type: map[string]interface {}, value: map[name:test]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EncodeByte">EncodeByte</span>
|
||||||
|
|
||||||
|
<p>Encode data to byte slice.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EncodeByte(data any) ([]byte, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
byteData, _ := convertor.EncodeByte("abc")
|
||||||
|
fmt.Println(byteData) //[]byte{6, 12, 0, 3, 97, 98, 99}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DecodeByte">DecodeByte</span>
|
||||||
|
|
||||||
|
<p>Decode byte data to target object. target should be a pointer instance.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DecodeByte(data []byte, target any) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var result string
|
||||||
|
byteData := []byte{6, 12, 0, 3, 97, 98, 99}
|
||||||
|
convertor.DecodeByte(byteData, &result)
|
||||||
|
fmt.Println(result) //"abc"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DeepClone">DeepClone</span>
|
||||||
|
|
||||||
|
<p>Creates a deep copy of passed item, can't clone unexported field of struct.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DeepClone[T any](src T) T
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type Struct struct {
|
||||||
|
Str string
|
||||||
|
Int int
|
||||||
|
Float float64
|
||||||
|
Bool bool
|
||||||
|
Nil interface{}
|
||||||
|
unexported string
|
||||||
|
}
|
||||||
|
|
||||||
|
cases := []interface{}{
|
||||||
|
true,
|
||||||
|
1,
|
||||||
|
0.1,
|
||||||
|
map[string]int{
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
},
|
||||||
|
&Struct{
|
||||||
|
Str: "test",
|
||||||
|
Int: 1,
|
||||||
|
Float: 0.1,
|
||||||
|
Bool: true,
|
||||||
|
Nil: nil,
|
||||||
|
// unexported: "can't be cloned",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range cases {
|
||||||
|
cloned := convertor.DeepClone(item)
|
||||||
|
|
||||||
|
isPointerEqual := &cloned == &item
|
||||||
|
fmt.Println(cloned, isPointerEqual)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// true false
|
||||||
|
// 1 false
|
||||||
|
// 0.1 false
|
||||||
|
// map[a:1 b:2] false
|
||||||
|
// &{test 1 0.1 true <nil> } false
|
||||||
|
}
|
||||||
|
```
|
||||||
503
docs/convertor_zh-CN.md
Normal file
503
docs/convertor_zh-CN.md
Normal file
@@ -0,0 +1,503 @@
|
|||||||
|
# Convertor
|
||||||
|
|
||||||
|
convertor 转换器包支持一些常见的数据类型转换
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/convertor/convertor.go](https://github.com/duke-git/lancet/blob/v1/convertor/convertor.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [ColorHexToRGB](#ColorHexToRGB)
|
||||||
|
- [ColorRGBToHex](#ColorRGBToHex)
|
||||||
|
- [ToBool](#ToBool)
|
||||||
|
- [ToBytes](#ToBytes)
|
||||||
|
- [ToChar](#ToChar)
|
||||||
|
- [ToChannel](#ToChannel)
|
||||||
|
- [ToFloat](#ToFloat)
|
||||||
|
- [ToInt](#ToInt)
|
||||||
|
- [ToJson](#ToJson)
|
||||||
|
- [ToString](#ToString)
|
||||||
|
- [StructToMap](#StructToMap)
|
||||||
|
- [EncodeByte](#EncodeByte)
|
||||||
|
- [DecodeByte](#DecodeByte)
|
||||||
|
- [DeepClone](#DeepClone)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
### <span id="ColorHexToRGB">ColorHexToRGB</span>
|
||||||
|
|
||||||
|
<p>颜色值十六进制转rgb</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ColorHexToRGB(colorHex string) (red, green, blue int)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
colorHex := "#003366"
|
||||||
|
r, g, b := ColorHexToRGB(colorHex)
|
||||||
|
fmt.Println(r, g, b) //0,51,102
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ColorRGBToHex">ColorRGBToHex</span>
|
||||||
|
|
||||||
|
<p>颜色值rgb转十六进制</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ColorRGBToHex(red, green, blue int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := 0
|
||||||
|
g := 51
|
||||||
|
b := 102
|
||||||
|
colorHex := ColorRGBToHex(r, g, b)
|
||||||
|
|
||||||
|
fmt.Println(colorHex) //#003366
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToBool">ToBool</span>
|
||||||
|
|
||||||
|
<p>字符串转布尔类型,使用strconv.ParseBool</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToBool(s string) (bool, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v1, _ := convertor.ToBool("1")
|
||||||
|
fmt.Println(v1) //true
|
||||||
|
|
||||||
|
v2, _ := convertor.ToBool("true")
|
||||||
|
fmt.Println(v2) //true
|
||||||
|
|
||||||
|
v3, _ := convertor.ToBool("True")
|
||||||
|
fmt.Println(v3) //true
|
||||||
|
|
||||||
|
v4, _ := convertor.ToBool("123")
|
||||||
|
fmt.Println(v4) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToBytes">ToBytes</span>
|
||||||
|
|
||||||
|
<p>interface转字节切片.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToBytes(data interface{}) ([]byte, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
bytesData, err := convertor.ToBytes("0")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
fmt.Println(bytesData) //[]bytes{3, 4, 0, 0}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToChar">ToChar</span>
|
||||||
|
|
||||||
|
<p>字符串转字符切片</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToChar(s string) []string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
chars := convertor.ToChar("")
|
||||||
|
fmt.Println(chars) //[]string{""}
|
||||||
|
|
||||||
|
chars = convertor.ToChar("abc")
|
||||||
|
fmt.Println(chars) //[]string{"a", "b", "c"}
|
||||||
|
|
||||||
|
chars = convertor.ToChar("1 2#3")
|
||||||
|
fmt.Println(chars) //[]string{"1", " ", "2", "#", "3"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToChannel">ToChannel</span>
|
||||||
|
|
||||||
|
<p>将切片转为只读channel</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToChannel(array []interface{}) <-chan interface{}
|
||||||
|
```
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<p>将interface转成float64类型,如果参数无法转换,会返回0和error</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToFloat(value interface{}) (float64, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v, err := convertor.ToFloat("")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err) //strconv.ParseFloat: parsing "": invalid syntax
|
||||||
|
}
|
||||||
|
fmt.Println(v) //0
|
||||||
|
|
||||||
|
v, _ = convertor.ToFloat("-.11")
|
||||||
|
fmt.Println(v) //-0.11
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToInt">ToInt</span>
|
||||||
|
|
||||||
|
<p>将interface转成intt64类型,如果参数无法转换,会返回0和error</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToInt(value interface{}) (int64, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v, err := convertor.ToInt("")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err) //strconv.ParseInt: parsing "": invalid syntax
|
||||||
|
}
|
||||||
|
fmt.Println(v) //0
|
||||||
|
|
||||||
|
v, _ = convertor.ToFloat(1.12)
|
||||||
|
fmt.Println(v) //1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToJson">ToJson</span>
|
||||||
|
|
||||||
|
<p>将interface转成json字符串,如果参数无法转换,会返回""和error</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToJson(value interface{}) (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var aMap = map[string]int{"a": 1, "b": 2, "c": 3}
|
||||||
|
jsonStr, _ := convertor.ToJson(aMap)
|
||||||
|
fmt.Printf("%q", jsonStr) //"{\"a\":1,\"b\":2,\"c\":3}"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToString">ToString</span>
|
||||||
|
|
||||||
|
<p>将interface转成字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ToString(value interface{}) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Printf("%q", convertor.ToString(1)) //"1"
|
||||||
|
fmt.Printf("%q", convertor.ToString(1.1)) //"1.1"
|
||||||
|
fmt.Printf("%q", convertor.ToString([]int{1, 2, 3})) //"[1,2,3]"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="StructToMap">StructToMap</span>
|
||||||
|
|
||||||
|
<p>将struct转成map,只会转换struct中可导出的字段。struct中导出字段需要设置json tag标记</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func StructToMap(value interface{}) (map[string]interface{}, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type People struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
age int
|
||||||
|
}
|
||||||
|
p := People{
|
||||||
|
"test",
|
||||||
|
100,
|
||||||
|
}
|
||||||
|
pm, _ := convertor.StructToMap(p)
|
||||||
|
|
||||||
|
fmt.Printf("type: %T, value: %s", pm, pm) //type: map[string]interface {}, value: map[name:test]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EncodeByte">EncodeByte</span>
|
||||||
|
|
||||||
|
<p>将data编码成字节切片</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EncodeByte(data any) ([]byte, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
byteData, _ := convertor.EncodeByte("abc")
|
||||||
|
fmt.Println(byteData) //[]byte{6, 12, 0, 3, 97, 98, 99}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DecodeByte">DecodeByte</span>
|
||||||
|
|
||||||
|
<p>解码字节切片到目标对象,目标对象需要传入一个指针实例子</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DecodeByte(data []byte, target any) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var result string
|
||||||
|
byteData := []byte{6, 12, 0, 3, 97, 98, 99}
|
||||||
|
convertor.DecodeByte(byteData, &result)
|
||||||
|
fmt.Println(result) //"abc"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DeepClone">DeepClone</span>
|
||||||
|
|
||||||
|
<p>创建一个传入值的深拷贝, 无法克隆结构体的非导出字段。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DeepClone[T any](src T) T
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/convertor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type Struct struct {
|
||||||
|
Str string
|
||||||
|
Int int
|
||||||
|
Float float64
|
||||||
|
Bool bool
|
||||||
|
Nil interface{}
|
||||||
|
unexported string
|
||||||
|
}
|
||||||
|
|
||||||
|
cases := []interface{}{
|
||||||
|
true,
|
||||||
|
1,
|
||||||
|
0.1,
|
||||||
|
map[string]int{
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
},
|
||||||
|
&Struct{
|
||||||
|
Str: "test",
|
||||||
|
Int: 1,
|
||||||
|
Float: 0.1,
|
||||||
|
Bool: true,
|
||||||
|
Nil: nil,
|
||||||
|
// unexported: "can't be cloned",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range cases {
|
||||||
|
cloned := convertor.DeepClone(item)
|
||||||
|
|
||||||
|
isPointerEqual := &cloned == &item
|
||||||
|
fmt.Println(cloned, isPointerEqual)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// true false
|
||||||
|
// 1 false
|
||||||
|
// 0.1 false
|
||||||
|
// map[a:1 b:2] false
|
||||||
|
// &{test 1 0.1 true <nil> } false
|
||||||
|
}
|
||||||
|
```
|
||||||
969
docs/cryptor.md
Normal file
969
docs/cryptor.md
Normal file
@@ -0,0 +1,969 @@
|
|||||||
|
# Cryptor
|
||||||
|
|
||||||
|
Package cryptor contains some functions for data encryption and decryption. Support base64, md5, hmac, aes, des, rsa.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
- [https://github.com/duke-git/lancet/blob/v1/cryptor/aes.go](https://github.com/duke-git/lancet/blob/v1/cryptor/aes.go)
|
||||||
|
- [https://github.com/duke-git/lancet/blob/v1/cryptor/des.go](https://github.com/duke-git/lancet/blob/v1/cryptor/des.go)
|
||||||
|
- [https://github.com/duke-git/lancet/blob/v1/cryptor/basic.go](https://github.com/duke-git/lancet/blob/v1/cryptor/basic.go)
|
||||||
|
- [https://github.com/duke-git/lancet/blob/v1/cryptor/rsa.go](https://github.com/duke-git/lancet/blob/v1/cryptor/rsa.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [AesEcbEncrypt](#AesEcbEncrypt)
|
||||||
|
- [AesEcbDecrypt](#AesEcbDecrypt)
|
||||||
|
- [AesCbcEncrypt](#AesCbcEncrypt)
|
||||||
|
- [AesCbcDecrypt](#AesCbcDecrypt)
|
||||||
|
- [AesCtrCrypt](#AesCtrCrypt)
|
||||||
|
- [AesCfbEncrypt](#AesCfbEncrypt)
|
||||||
|
- [AesCfbDecrypt](#AesCfbDecrypt)
|
||||||
|
- [AesOfbEncrypt](#AesOfbEncrypt)
|
||||||
|
- [AesOfbDecrypt](#AesOfbDecrypt)
|
||||||
|
- [Base64StdEncode](#Base64StdEncode)
|
||||||
|
- [Base64StdDecode](#Base64StdDecode)
|
||||||
|
- [DesEcbEncrypt](#DesEcbEncrypt)
|
||||||
|
- [DesEcbDecrypt](#DesEcbDecrypt)
|
||||||
|
- [DesCbcEncrypt](#DesCbcEncrypt)
|
||||||
|
- [DesCbcDecrypt](#DesCbcDecrypt)
|
||||||
|
- [DesCtrCrypt](#DesCtrCrypt)
|
||||||
|
- [DesCfbEncrypt](#DesCfbEncrypt)
|
||||||
|
- [DesCfbDecrypt](#DesCfbDecrypt)
|
||||||
|
- [DesOfbEncrypt](#DesOfbEncrypt)
|
||||||
|
- [DesOfbDecrypt](#DesOfbDecrypt)
|
||||||
|
- [HmacMd5](#HmacMd5)
|
||||||
|
- [HmacSha1](#HmacSha1)
|
||||||
|
- [HmacSha256](#HmacSha256)
|
||||||
|
- [HmacSha512](#HmacSha512)
|
||||||
|
- [Md5String](#Md5String)
|
||||||
|
- [Md5File](#Md5File)
|
||||||
|
- [Sha1](#Sha1)
|
||||||
|
- [Sha256](#Sha256)
|
||||||
|
- [Sha512](#Sha512)
|
||||||
|
- [GenerateRsaKey](#GenerateRsaKey)
|
||||||
|
- [RsaEncrypt](#RsaEncrypt)
|
||||||
|
- [RsaDecrypt](#RsaDecrypt)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="AesEcbEncrypt">AesEcbEncrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt data with key use AES ECB algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesEcbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesEcbDecrypt">AesEcbDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with key use AES ECB algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesEcbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCbcEncrypt">AesCbcEncrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt data with key use AES CBC algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCbcEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCbcDecrypt">AesCbcDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with key use AES CBC algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCbcDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCtrCrypt">AesCtrCrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt or decrypt data with key use AES CTR algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCtrCrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCfbEncrypt">AesCfbEncrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt data with key use AES CFB algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCfbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCfbDecrypt">AesCfbDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with key use AES CBC algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCfbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesOfbEncrypt">AesOfbEncrypt</span>
|
||||||
|
|
||||||
|
<p>Enecrypt data with key use AES OFB algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesOfbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCfbDecrypt">AesOfbDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with key use AES OFB algorithm. Length of `key` param should be 16, 24 or 32.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesOfbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesOfbDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Base64StdEncode">Base64StdEncode</span>
|
||||||
|
|
||||||
|
<p>Encode string with base64 encoding.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Base64StdEncode(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
base64Str := cryptor.Base64StdEncode("hello world")
|
||||||
|
fmt.Println(base64Str) //aGVsbG8gd29ybGQ=
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Base64StdDecode">Base64StdDecode</span>
|
||||||
|
|
||||||
|
<p>Decode a base64 encoded string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Base64StdDecode(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
str := cryptor.Base64StdDecode("aGVsbG8gd29ybGQ=")
|
||||||
|
fmt.Println(str) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesEcbEncrypt">DesEcbEncrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt data with key use DES ECB algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesEcbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesEcbDecrypt">DesEcbDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with key use DES ECB algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesEcbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byt(key)
|
||||||
|
decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCbcEncrypt">DesCbcEncrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt data with key use DES CBC algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCbcEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byt(key)
|
||||||
|
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCbcDecrypt">DesCbcDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with key use DES CBC algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCbcDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byt(key)
|
||||||
|
decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCtrCrypt">DesCtrCrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt or decrypt data with key use DES CTR algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCtrCrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCfbEncrypt">DesCfbEncrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt data with key use DES CFB algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCfbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byt(key)
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCfbDecrypt">DesCfbDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with key use DES CBC algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCfbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byt(key)
|
||||||
|
decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesOfbEncrypt">DesOfbEncrypt</span>
|
||||||
|
|
||||||
|
<p>Enecrypt data with key use DES OFB algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesOfbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesOfbDecrypt">DesOfbDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with key use DES OFB algorithm. Length of `key` param should be 8.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesOfbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HmacMd5">HmacMd5</span>
|
||||||
|
|
||||||
|
<p>Get the md5 hmac hash of string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func HmacMd5(data, key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.HmacMd5("hello world", "12345"))
|
||||||
|
fmt.Println(s) //5f4c9faaff0a1ad3007d9ddc06abe36d
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HmacSha1">HmacSha1</span>
|
||||||
|
|
||||||
|
<p>Get the sha1 hmac hash of string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func HmacSha1(data, key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.HmacSha1("hello world", "12345"))
|
||||||
|
fmt.Println(s) //3826f812255d8683f051ee97346d1359234d5dbd
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HmacSha256">HmacSha256</span>
|
||||||
|
|
||||||
|
<p>Get the sha256 hmac hash of string</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func HmacSha256(data, key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.HmacSha256("hello world", "12345"))
|
||||||
|
fmt.Println(s) //9dce2609f2d67d41f74c7f9efc8ccd44370d41ad2de52982627588dfe7289ab8
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HmacSha512">HmacSha512</span>
|
||||||
|
|
||||||
|
<p>Get the sha512 hmac hash of string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func HmacSha512(data, key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.HmacSha512("hello world", "12345"))
|
||||||
|
fmt.Println(s) //5b1563ac4e9b49c9ada8ccb232588fc4f0c30fd12f756b3a0b95af4985c236ca60925253bae10ce2c6bf9af1c1679b51e5395ff3d2826c0a2c7c0d72225d4175
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Md5String">Md5String</span>
|
||||||
|
|
||||||
|
<p>Get the md5 value of string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Md5String(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Md5String("hello"))
|
||||||
|
fmt.Println(s) //5d41402abc4b2a76b9719d911017c592
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Md5File">Md5File</span>
|
||||||
|
|
||||||
|
<p>Get the md5 value of file.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Md5File(filepath string) (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Md5File("./main.go"))
|
||||||
|
fmt.Println(s)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Sha1">Sha1</span>
|
||||||
|
|
||||||
|
<p>Get the sha1 value of string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Sha1(data string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Sha1("hello world"))
|
||||||
|
fmt.Println(s) //2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Sha256">Sha256</span>
|
||||||
|
|
||||||
|
<p>Get the sha256 value of string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Sha256(data string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Sha256("hello world"))
|
||||||
|
fmt.Println(s) //b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Sha512">Sha512</span>
|
||||||
|
|
||||||
|
<p>Get the sha512 value of string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Sha512(data string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Sha512("hello world"))
|
||||||
|
fmt.Println(s) //309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GenerateRsaKey">GenerateRsaKey</span>
|
||||||
|
|
||||||
|
<p>Create the rsa public and private key file in current directory.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RsaEncrypt">RsaEncrypt</span>
|
||||||
|
|
||||||
|
<p>Encrypt data with public key file useing ras algorithm.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RsaEncrypt(data []byte, pubKeyFileName string) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := []byte("hello world")
|
||||||
|
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
||||||
|
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RsaDecrypt">RsaDecrypt</span>
|
||||||
|
|
||||||
|
<p>Decrypt data with private key file useing ras algorithm.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RsaDecrypt(data []byte, privateKeyFileName string) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := []byte("hello world")
|
||||||
|
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
||||||
|
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
967
docs/cryptor_zh-CN.md
Normal file
967
docs/cryptor_zh-CN.md
Normal file
@@ -0,0 +1,967 @@
|
|||||||
|
# Cryptor
|
||||||
|
|
||||||
|
cryptor 加密包支持数据加密和解密,获取 md5,hash 值。支持 base64, md5, hmac, aes, des, rsa。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
- [https://github.com/duke-git/lancet/blob/v1/cryptor/aes.go](https://github.com/duke-git/lancet/blob/v1/cryptor/aes.go)
|
||||||
|
- [https://github.com/duke-git/lancet/blob/v1/cryptor/des.go](https://github.com/duke-git/lancet/blob/v1/cryptor/des.go)
|
||||||
|
- [https://github.com/duke-git/lancet/blob/v1/cryptor/basic.go](https://github.com/duke-git/lancet/blob/v1/cryptor/basic.go)
|
||||||
|
- [https://github.com/duke-git/lancet/blob/v1/cryptor/rsa.go](https://github.com/duke-git/lancet/blob/v1/cryptor/rsa.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [AesEcbEncrypt](#AesEcbEncrypt)
|
||||||
|
- [AesEcbDecrypt](#AesEcbDecrypt)
|
||||||
|
- [AesCbcEncrypt](#AesCbcEncrypt)
|
||||||
|
- [AesCbcDecrypt](#AesCbcDecrypt)
|
||||||
|
- [AesCtrCrypt](#AesCtrCrypt)
|
||||||
|
- [AesCfbEncrypt](#AesCfbEncrypt)
|
||||||
|
- [AesCfbDecrypt](#AesCfbDecrypt)
|
||||||
|
- [AesOfbEncrypt](#AesOfbEncrypt)
|
||||||
|
- [AesOfbDecrypt](#AesOfbDecrypt)
|
||||||
|
- [Base64StdEncode](#Base64StdEncode)
|
||||||
|
- [Base64StdDecode](#Base64StdDecode)
|
||||||
|
- [DesEcbEncrypt](#DesEcbEncrypt)
|
||||||
|
- [DesEcbDecrypt](#DesEcbDecrypt)
|
||||||
|
- [DesCbcEncrypt](#DesCbcEncrypt)
|
||||||
|
- [DesCbcDecrypt](#DesCbcDecrypt)
|
||||||
|
- [DesCtrCrypt](#DesCtrCrypt)
|
||||||
|
- [DesCfbEncrypt](#DesCfbEncrypt)
|
||||||
|
- [DesCfbDecrypt](#DesCfbDecrypt)
|
||||||
|
- [DesOfbEncrypt](#DesOfbEncrypt)
|
||||||
|
- [DesOfbDecrypt](#DesOfbDecrypt)
|
||||||
|
- [HmacMd5](#HmacMd5)
|
||||||
|
- [HmacSha1](#HmacSha1)
|
||||||
|
- [HmacSha256](#HmacSha256)
|
||||||
|
- [HmacSha512](#HmacSha512)
|
||||||
|
- [Md5String](#Md5String)
|
||||||
|
- [Md5File](#Md5File)
|
||||||
|
- [Sha1](#Sha1)
|
||||||
|
- [Sha256](#Sha256)
|
||||||
|
- [Sha512](#Sha512)
|
||||||
|
- [GenerateRsaKey](#GenerateRsaKey)
|
||||||
|
- [RsaEncrypt](#RsaEncrypt)
|
||||||
|
- [RsaDecrypt](#RsaDecrypt)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
### <span id="AesEcbEncrypt">AesEcbEncrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES ECB算法模式加密数据. 参数`key`的长度是16, 24 or 32。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesEcbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesEcbDecrypt">AesEcbDecrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES ECB算法模式解密数据. 参数`key`的长度是16, 24 or 32。
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesEcbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCbcEncrypt">AesCbcEncrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES CBC算法模式加密数据. 参数`key`的长度是16, 24 or 32。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCbcEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCbcDecrypt">AesCbcDecrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES CBC算法模式解密数据. 参数`key`的长度是16, 24 or 32。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCbcDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCtrCrypt">AesCtrCrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES CTR算法模式加密/解密数据. 参数`key`的长度是16, 24 or 32。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCtrCrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCfbEncrypt">AesCfbEncrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES CFB算法模式加密数据. 参数`key`的长度是16, 24 or 32。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCfbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCfbDecrypt">AesCfbDecrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES CFB算法模式解密数据. 参数`key`的长度是16, 24 or 32。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesCfbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesOfbEncrypt">AesOfbEncrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES OFB算法模式加密数据. 参数`key`的长度是16, 24 or 32</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesOfbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AesCfbDecrypt">AesOfbDecrypt</span>
|
||||||
|
|
||||||
|
<p>使用AES OFB算法模式解密数据. 参数`key`的长度是16, 24 or 32</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AesOfbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefghijklmnop"
|
||||||
|
encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.AesOfbDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Base64StdEncode">Base64StdEncode</span>
|
||||||
|
|
||||||
|
<p>将字符串base64编码</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Base64StdEncode(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
base64Str := cryptor.Base64StdEncode("hello world")
|
||||||
|
fmt.Println(base64Str) //aGVsbG8gd29ybGQ=
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Base64StdDecode">Base64StdDecode</span>
|
||||||
|
|
||||||
|
<p>解码base64字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Base64StdDecode(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
str := cryptor.Base64StdDecode("aGVsbG8gd29ybGQ=")
|
||||||
|
fmt.Println(str) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesEcbEncrypt">DesEcbEncrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES ECB算法模式加密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesEcbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesEcbDecrypt">DesEcbDecrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES ECB算法模式解密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesEcbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCbcEncrypt">DesCbcEncrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES CBC算法模式加密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCbcEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCbcDecrypt">DesCbcDecrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES CBC算法模式解密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCbcDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCtrCrypt">DesCtrCrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES CTR算法模式加密/解密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCtrCrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
|
||||||
|
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCfbEncrypt">DesCfbEncrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES CFB算法模式加密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCfbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesCfbDecrypt">DesCfbDecrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES CFB算法模式解密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesCfbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesOfbEncrypt">DesOfbEncrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES OFB算法模式加密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesOfbEncrypt(data, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
||||||
|
fmt.Println(string(encrypted))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DesOfbDecrypt">DesOfbDecrypt</span>
|
||||||
|
|
||||||
|
<p>使用DES OFB算法模式解密数据. 参数`key`的长度是8</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func DesOfbDecrypt(encrypted, key []byte) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := "hello world"
|
||||||
|
key := "abcdefgh"
|
||||||
|
encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
|
||||||
|
decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HmacMd5">HmacMd5</span>
|
||||||
|
|
||||||
|
<p>获取字符串md5 hmac值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func HmacMd5(data, key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.HmacMd5("hello world", "12345"))
|
||||||
|
fmt.Println(s) //5f4c9faaff0a1ad3007d9ddc06abe36d
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HmacSha1">HmacSha1</span>
|
||||||
|
|
||||||
|
<p>获取字符串sha1 hmac值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func HmacSha1(data, key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.HmacSha1("hello world", "12345"))
|
||||||
|
fmt.Println(s) //3826f812255d8683f051ee97346d1359234d5dbd
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HmacSha256">HmacSha256</span>
|
||||||
|
|
||||||
|
<p>获取字符串sha256 hmac值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func HmacSha256(data, key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.HmacSha256("hello world", "12345"))
|
||||||
|
fmt.Println(s) //9dce2609f2d67d41f74c7f9efc8ccd44370d41ad2de52982627588dfe7289ab8
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HmacSha512">HmacSha512</span>
|
||||||
|
|
||||||
|
<p>获取字符串sha512 hmac值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func HmacSha512(data, key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.HmacSha512("hello world", "12345"))
|
||||||
|
fmt.Println(s)
|
||||||
|
//5b1563ac4e9b49c9ada8ccb232588fc4f0c30fd12f756b3a0b95af4985c236ca60925253bae10ce2c6bf9af1c1679b51e5395ff3d2826c0a2c7c0d72225d4175
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Md5String">Md5String</span>
|
||||||
|
|
||||||
|
<p>获取字符串md5值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Md5String(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Md5String("hello"))
|
||||||
|
fmt.Println(s) //5d41402abc4b2a76b9719d911017c592
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Md5File">Md5File</span>
|
||||||
|
|
||||||
|
<p>获取文件md5值.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Md5File(filepath string) (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Md5File("./main.go"))
|
||||||
|
fmt.Println(s)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Sha1">Sha1</span>
|
||||||
|
|
||||||
|
<p>获取字符串sha1值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Sha1(data string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Sha1("hello world"))
|
||||||
|
fmt.Println(s) //2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Sha256">Sha256</span>
|
||||||
|
|
||||||
|
<p>获取字符串sha256值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Sha256(data string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Sha256("hello world"))
|
||||||
|
fmt.Println(s) //b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Sha512">Sha512</span>
|
||||||
|
|
||||||
|
<p>获取字符串sha512值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Sha512(data string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := cryptor.Sha512("hello world"))
|
||||||
|
fmt.Println(s) //309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GenerateRsaKey">GenerateRsaKey</span>
|
||||||
|
|
||||||
|
<p>在当前目录下创建rsa私钥文件和公钥文件</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RsaEncrypt">RsaEncrypt</span>
|
||||||
|
|
||||||
|
<p>用公钥文件ras加密数据</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RsaEncrypt(data []byte, pubKeyFileName string) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := []byte("hello world")
|
||||||
|
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
||||||
|
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RsaDecrypt">RsaDecrypt</span>
|
||||||
|
|
||||||
|
<p>用私钥文件rsa解密数据</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RsaDecrypt(data []byte, privateKeyFileName string) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>列子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/cryptor"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := []byte("hello world")
|
||||||
|
encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
|
||||||
|
decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
|
||||||
|
fmt.Println(string(decrypted)) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
923
docs/datetime.md
Normal file
923
docs/datetime.md
Normal file
@@ -0,0 +1,923 @@
|
|||||||
|
# Datetime
|
||||||
|
|
||||||
|
Package datetime supports date and time format and compare.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/datetime/datetime.go](https://github.com/duke-git/lancet/blob/v1/datetime/datetime.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [AddDay](#AddDay)
|
||||||
|
- [AddHour](#AddHour)
|
||||||
|
- [AddMinute](#AddMinute)
|
||||||
|
- [BeginOfMinute](#BeginOfMinute)
|
||||||
|
- [BeginOfHour](#BeginOfHour)
|
||||||
|
- [BeginOfDay](#BeginOfDay)
|
||||||
|
- [BeginOfWeek](#BeginOfWeek)
|
||||||
|
- [BeginOfMonth](#BeginOfMonth)
|
||||||
|
- [BeginOfYear](#BeginOfYear)
|
||||||
|
- [EndOfMinute](#EndOfMinute)
|
||||||
|
- [EndOfHour](#EndOfHour)
|
||||||
|
- [EndOfDay](#EndOfDay)
|
||||||
|
- [EndOfWeek](#EndOfWeek)
|
||||||
|
- [EndOfMonth](#EndOfMonth)
|
||||||
|
- [EndOfYear](#EndOfYear)
|
||||||
|
- [GetNowDate](#GetNowDate)
|
||||||
|
- [GetNowTime](#GetNowTime)
|
||||||
|
- [GetNowDateTime](#GetNowDateTime)
|
||||||
|
- [GetZeroHourTimestamp](#GetZeroHourTimestamp)
|
||||||
|
- [GetNightTimestamp](#GetNightTimestamp)
|
||||||
|
- [FormatTimeToStr](#FormatTimeToStr)
|
||||||
|
- [FormatStrToTime](#FormatStrToTime)
|
||||||
|
- [NewUnixNow](#NewUnixNow)
|
||||||
|
- [NewUnix](#NewUnix)
|
||||||
|
- [NewFormat](#NewFormat)
|
||||||
|
- [NewISO8601](#NewISO8601)
|
||||||
|
- [ToUnix](#ToUnix)
|
||||||
|
- [ToFormat](#ToFormat)
|
||||||
|
- [ToFormatForTpl](#ToFormatForTpl)
|
||||||
|
- [ToIso8601](#ToIso8601)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
## Note:
|
||||||
|
|
||||||
|
1. 'format' string param in func FormatTimeToStr and FormatStrToTime function should be one of flows:
|
||||||
|
|
||||||
|
- yyyy-mm-dd hh:mm:ss
|
||||||
|
- yyyy-mm-dd hh:mm
|
||||||
|
- yyyy-mm-dd hh
|
||||||
|
- yyyy-mm-dd
|
||||||
|
- yyyy-mm
|
||||||
|
- mm-dd
|
||||||
|
- dd-mm-yy hh:mm:ss
|
||||||
|
- yyyy/mm/dd hh:mm:ss
|
||||||
|
- yyyy/mm/dd hh:mm
|
||||||
|
- yyyy-mm-dd hh
|
||||||
|
- yyyy/mm/dd
|
||||||
|
- yyyy/mm
|
||||||
|
- mm/dd
|
||||||
|
- dd/mm/yy hh:mm:ss
|
||||||
|
- yyyy
|
||||||
|
- mm
|
||||||
|
- hh:mm:ss
|
||||||
|
- mm:ss
|
||||||
|
|
||||||
|
### <span id="AddDay">AddDay</span>
|
||||||
|
|
||||||
|
<p>Add or sub days to time.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AddDay(t time.Time, day int64) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
after2Days := datetime.AddDay(now, 2)
|
||||||
|
before2Days := datetime.AddDay(now, -2)
|
||||||
|
|
||||||
|
fmt.Println(after2Days, before2Days)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AddHour">AddHour</span>
|
||||||
|
|
||||||
|
<p>Add or sub hours to time.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AddHour(t time.Time, hour int64) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
after2Hours := datetime.AddHour(now, 2)
|
||||||
|
before2Hours := datetime.AddHour(now, -2)
|
||||||
|
|
||||||
|
fmt.Println(after2Hours, after2Hours)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AddMinute">AddMinute</span>
|
||||||
|
|
||||||
|
<p>Add or sub minutes to time.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AddMinute(t time.Time, minute int64) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
after2Minute := datetime.AddMinute(now, 2)
|
||||||
|
before2Minute := datetime.AddMinute(now, -2)
|
||||||
|
|
||||||
|
fmt.Println(after2Minute, before2Minute)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfMinute">BeginOfMinute</span>
|
||||||
|
|
||||||
|
<p>Return beginning minute time of day.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfMinute(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfMinute(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 15:48:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfHour">BeginOfHour</span>
|
||||||
|
|
||||||
|
<p>Return zero time of day.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfHour(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfHour(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 15:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfDay">BeginOfDay</span>
|
||||||
|
|
||||||
|
<p>Return begin time of day.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfDay(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfDay(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 00:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfWeek">BeginOfWeek</span>
|
||||||
|
|
||||||
|
<p>Return beginning time of week, week begin from Sunday.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfWeek(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfWeek(td)
|
||||||
|
fmt.Println(bm) //2022-02-13 00:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfMonth">BeginOfMonth</span>
|
||||||
|
|
||||||
|
<p>Return beginning time of month</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfMonth(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfMonth(td)
|
||||||
|
fmt.Println(bm) //2022-02-01 00:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfYear">BeginOfYear</span>
|
||||||
|
|
||||||
|
<p>Return beginning time of year.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfYear(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfYear(td)
|
||||||
|
fmt.Println(bm) //2022-01-01 00:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfMinute">EndOfMinute</span>
|
||||||
|
|
||||||
|
<p>Return end time minute of day.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfMinute(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfMinute(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 15:48:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfHour">EndOfHour</span>
|
||||||
|
|
||||||
|
<p>Return end time hour of day.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfHour(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfHour(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 15:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfDay">EndOfDay</span>
|
||||||
|
|
||||||
|
<p>Return end time hour of day.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfDay(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfDay(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 23:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfWeek">EndOfWeek</span>
|
||||||
|
|
||||||
|
<p>Return end time of week, week end with Saturday.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfWeek(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfWeek(td)
|
||||||
|
fmt.Println(bm) //2022-02-19 23:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfMonth">EndOfMonth</span>
|
||||||
|
|
||||||
|
<p>Return end time of month</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfMonth(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfMonth(td)
|
||||||
|
fmt.Println(bm) //2022-02-28 23:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfYear">EndOfYear</span>
|
||||||
|
|
||||||
|
<p>Return beginning time of year.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfYear(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfYear(td)
|
||||||
|
fmt.Println(bm) //2022-12-31 23:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetNowDate">GetNowDate</span>
|
||||||
|
|
||||||
|
<p>Get current date string, format is yyyy-mm-dd.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetNowDate() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
currentDate := datetime.GetNowDate()
|
||||||
|
fmt.Println(currentDate) // 2022-01-28
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetNowTime">GetNowTime</span>
|
||||||
|
|
||||||
|
<p>Get current time string, format is hh:mm:ss.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetNowTime() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
currentTime := datetime.GetNowTime()
|
||||||
|
fmt.Println(currentDate) // 15:57:33
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetNowDateTime">GetNowDateTime</span>
|
||||||
|
|
||||||
|
<p>Get current date time string, format is yyyy-mm-dd hh:mm:ss.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetNowDateTime() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
current := datetime.GetNowDateTime()
|
||||||
|
fmt.Println(current) // 2022-01-28 15:59:33
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetZeroHourTimestamp">GetZeroHourTimestamp</span>
|
||||||
|
|
||||||
|
<p>Return timestamp of zero hour (timestamp of 00:00).</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetZeroHourTimestamp() int64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
zeroTime := datetime.GetZeroHourTimestamp()
|
||||||
|
fmt.Println(zeroTime) // 1643299200
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetNightTimestamp">GetNightTimestamp</span>
|
||||||
|
|
||||||
|
<p>Return timestamp of zero hour (timestamp of 23:59).</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetNightTimestamp() int64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
nightTime := datetime.GetNightTimestamp()
|
||||||
|
fmt.Println(nightTime) // 1643385599
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="FormatTimeToStr">FormatTimeToStr</span>
|
||||||
|
|
||||||
|
<p>Format time to string, `format` param specification see note 1.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func FormatTimeToStr(t time.Time, format string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
timeStr := datetime.FormatTimeToStr(now, "yyyy/mm/dd hh:mm:ss")
|
||||||
|
fmt.Println(timeStr) //2022/01/28 16:07:44
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="FormatStrToTime">FormatStrToTime</span>
|
||||||
|
|
||||||
|
<p>Format string to time, `format` param specification see note 1.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func FormatStrToTime(str, format string) (time.Time, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
time := datetime.FormatStrToTime("2006-01-02 15:04:05", "yyyy/mm/dd hh:mm:ss")
|
||||||
|
fmt.Println(time)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="NewUnixNow">NewUnixNow</span>
|
||||||
|
|
||||||
|
<p>Return unix timestamp of current time</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
func NewUnixNow() *theTime
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm := datetime.NewUnixNow()
|
||||||
|
fmt.Println(tm) //&{1647597438}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="NewUnix">NewUnix</span>
|
||||||
|
|
||||||
|
<p>Return unix timestamp of specified int64 value.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
func NewUnix(unix int64) *theTime
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm := datetime.NewUnix(1647597438)
|
||||||
|
fmt.Println(tm) //&{1647597438}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="NewFormat">NewFormat</span>
|
||||||
|
|
||||||
|
<p>Return unix timestamp of specified time string, t should be "yyyy-mm-dd hh:mm:ss".</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
func NewFormat(t string) (*theTime, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, err := datetime.NewFormat("2022-03-18 17:04:05")
|
||||||
|
fmt.Println(tm) //&{1647594245}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="NewISO8601">NewISO8601</span>
|
||||||
|
|
||||||
|
<p>Return unix timestamp of specified iso8601 time string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
func NewISO8601(iso8601 string) (*theTime, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
|
||||||
|
fmt.Println(tm) //&{1136214245}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToUnix">ToUnix</span>
|
||||||
|
|
||||||
|
<p>Return unix timestamp.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (t *theTime) ToUnix() int64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm := datetime.NewUnixNow()
|
||||||
|
fmt.Println(tm.ToUnix()) //1647597438
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToFormat">ToFormat</span>
|
||||||
|
|
||||||
|
<p>Return time string 'yyyy-mm-dd hh:mm:ss'.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (t *theTime) ToFormat() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
|
||||||
|
fmt.Println(tm.ToFormat()) //"2022-03-18 17:04:05"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToFormatForTpl">ToFormatForTpl</span>
|
||||||
|
|
||||||
|
<p>Return the time string which format is specified tpl.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (t *theTime) ToFormatForTpl(tpl string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
|
||||||
|
ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
|
||||||
|
fmt.Println(ts) //"2022/03/18 17:04:05"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToIso8601">ToIso8601</span>
|
||||||
|
|
||||||
|
<p>Return iso8601 time string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (t *theTime) ToIso8601() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
|
||||||
|
ts := tm.ToIso8601()
|
||||||
|
fmt.Println(ts) //"2006-01-02T23:04:05+08:00"
|
||||||
|
}
|
||||||
|
```
|
||||||
923
docs/datetime_zh-CN.md
Normal file
923
docs/datetime_zh-CN.md
Normal file
@@ -0,0 +1,923 @@
|
|||||||
|
# Datetime
|
||||||
|
|
||||||
|
datetime 日期时间处理包,格式化日期,比较日期。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/datetime/datetime.go](https://github.com/duke-git/lancet/blob/v1/datetime/datetime.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [AddDay](#AddDay)
|
||||||
|
- [AddHour](#AddHour)
|
||||||
|
- [AddMinute](#AddMinute)
|
||||||
|
- [BeginOfMinute](#BeginOfMinute)
|
||||||
|
- [BeginOfHour](#BeginOfHour)
|
||||||
|
- [BeginOfDay](#BeginOfDay)
|
||||||
|
- [BeginOfWeek](#BeginOfWeek)
|
||||||
|
- [BeginOfMonth](#BeginOfMonth)
|
||||||
|
- [BeginOfYear](#BeginOfYear)
|
||||||
|
- [EndOfMinute](#EndOfMinute)
|
||||||
|
- [EndOfHour](#EndOfHour)
|
||||||
|
- [EndOfDay](#EndOfDay)
|
||||||
|
- [EndOfWeek](#EndOfWeek)
|
||||||
|
- [EndOfMonth](#EndOfMonth)
|
||||||
|
- [EndOfYear](#EndOfYear)
|
||||||
|
- [GetNowDate](#GetNowDate)
|
||||||
|
- [GetNowTime](#GetNowTime)
|
||||||
|
- [GetNowDateTime](#GetNowDateTime)
|
||||||
|
- [GetZeroHourTimestamp](#GetZeroHourTimestamp)
|
||||||
|
- [GetNightTimestamp](#GetNightTimestamp)
|
||||||
|
- [FormatTimeToStr](#FormatTimeToStr)
|
||||||
|
- [FormatStrToTime](#FormatStrToTime)
|
||||||
|
- [NewUnixNow](#NewUnixNow)
|
||||||
|
- [NewUnix](#NewUnix)
|
||||||
|
- [NewFormat](#NewFormat)
|
||||||
|
- [NewISO8601](#NewISO8601)
|
||||||
|
- [ToUnix](#ToUnix)
|
||||||
|
- [ToFormat](#ToFormat)
|
||||||
|
- [ToFormatForTpl](#ToFormatForTpl)
|
||||||
|
- [ToIso8601](#ToIso8601)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
## 注:
|
||||||
|
|
||||||
|
1. 方法 FormatTimeToStr 和 FormatStrToTime 中的 format 参数值需要传以下类型之一:
|
||||||
|
|
||||||
|
- yyyy-mm-dd hh:mm:ss
|
||||||
|
- yyyy-mm-dd hh:mm
|
||||||
|
- yyyy-mm-dd hh
|
||||||
|
- yyyy-mm-dd
|
||||||
|
- yyyy-mm
|
||||||
|
- mm-dd
|
||||||
|
- dd-mm-yy hh:mm:ss
|
||||||
|
- yyyy/mm/dd hh:mm:ss
|
||||||
|
- yyyy/mm/dd hh:mm
|
||||||
|
- yyyy-mm-dd hh
|
||||||
|
- yyyy/mm/dd
|
||||||
|
- yyyy/mm
|
||||||
|
- mm/dd
|
||||||
|
- dd/mm/yy hh:mm:ss
|
||||||
|
- yyyy
|
||||||
|
- mm
|
||||||
|
- hh:mm:ss
|
||||||
|
- mm:ss
|
||||||
|
|
||||||
|
### <span id="AddDay">AddDay</span>
|
||||||
|
|
||||||
|
<p>将日期加/减天数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AddDay(t time.Time, day int64) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
after2Days := datetime.AddDay(now, 2)
|
||||||
|
before2Days := datetime.AddDay(now, -2)
|
||||||
|
|
||||||
|
fmt.Println(after2Days, before2Days)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AddHour">AddHour</span>
|
||||||
|
|
||||||
|
<p>将日期加/减小时数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AddHour(t time.Time, hour int64) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
after2Hours := datetime.AddHour(now, 2)
|
||||||
|
before2Hours := datetime.AddHour(now, -2)
|
||||||
|
|
||||||
|
fmt.Println(after2Hours, after2Hours)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AddMinute">AddMinute</span>
|
||||||
|
|
||||||
|
<p>将日期加/减分钟数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AddMinute(t time.Time, minute int64) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
after2Minute := datetime.AddMinute(now, 2)
|
||||||
|
before2Minute := datetime.AddMinute(now, -2)
|
||||||
|
|
||||||
|
fmt.Println(after2Minute, before2Minute)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfMinute">BeginOfMinute</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的分钟开始时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfMinute(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfMinute(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 15:48:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfHour">BeginOfHour</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的小时开始时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfHour(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfHour(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 15:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfDay">BeginOfDay</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的当天开始时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfDay(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfDay(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 00:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfWeek">BeginOfWeek</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的星期开始时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfWeek(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfWeek(td)
|
||||||
|
fmt.Println(bm) //2022-02-13 00:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfMonth">BeginOfMonth</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的当月开始时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfMonth(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfMonth(td)
|
||||||
|
fmt.Println(bm) //2022-02-01 00:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeginOfYear">BeginOfYear</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的当年开始时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeginOfYear(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.BeginOfYear(td)
|
||||||
|
fmt.Println(bm) //2022-01-01 00:00:00 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfMinute">EndOfMinute</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的分钟结束时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfMinute(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfMinute(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 15:48:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfHour">EndOfHour</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的小时结束时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfHour(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfHour(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 15:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfDay">EndOfDay</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的当天结束时间.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfDay(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfDay(td)
|
||||||
|
fmt.Println(bm) //2022-02-15 23:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfWeek">EndOfWeek</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的星期结束时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfWeek(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfWeek(td)
|
||||||
|
fmt.Println(bm) //2022-02-19 23:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfMonth">EndOfMonth</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的月份结束时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfMonth(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfMonth(td)
|
||||||
|
fmt.Println(bm) //2022-02-28 23:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="EndOfYear">EndOfYear</span>
|
||||||
|
|
||||||
|
<p>返回指定时间的年份结束时间</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func EndOfYear(t time.Time) time.Time
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
td := time.Date(2022, 2, 15, 15, 48, 40, 112, time.Local)
|
||||||
|
bm := datetime.EndOfYear(td)
|
||||||
|
fmt.Println(bm) //2022-12-31 23:59:59.999999999 +0800 CST
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetNowDate">GetNowDate</span>
|
||||||
|
|
||||||
|
<p>获取当天日期,返回格式:yyyy-mm-dd</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetNowDate() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
currentDate := datetime.GetNowDate()
|
||||||
|
fmt.Println(currentDate) // 2022-01-28
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetNowTime">GetNowTime</span>
|
||||||
|
|
||||||
|
<p>获取当时时间,返回格式:hh:mm:ss</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetNowTime() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
currentTime := datetime.GetNowTime()
|
||||||
|
fmt.Println(currentDate) // 15:57:33
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetNowDateTime">GetNowDateTime</span>
|
||||||
|
|
||||||
|
<p>获取当时日期和时间,返回格式:yyyy-mm-dd hh:mm:ss.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetNowDateTime() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
current := datetime.GetNowDateTime()
|
||||||
|
fmt.Println(current) // 2022-01-28 15:59:33
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetZeroHourTimestamp">GetZeroHourTimestamp</span>
|
||||||
|
|
||||||
|
<p>获取零时时间戳(timestamp of 00:00).</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetZeroHourTimestamp() int64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
zeroTime := datetime.GetZeroHourTimestamp()
|
||||||
|
fmt.Println(zeroTime) // 1643299200
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetNightTimestamp">GetNightTimestamp</span>
|
||||||
|
|
||||||
|
<p>获取午夜时间戳(timestamp of 23:59).</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetNightTimestamp() int64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
nightTime := datetime.GetNightTimestamp()
|
||||||
|
fmt.Println(nightTime) // 1643385599
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="FormatTimeToStr">FormatTimeToStr</span>
|
||||||
|
|
||||||
|
<p>将日期格式化成字符串,`format` 参数格式参考注<sup>1</sup></p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func FormatTimeToStr(t time.Time, format string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
now := time.Now()
|
||||||
|
timeStr := datetime.FormatTimeToStr(now, "yyyy/mm/dd hh:mm:ss")
|
||||||
|
fmt.Println(timeStr) //2022/01/28 16:07:44
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="FormatStrToTime">FormatStrToTime</span>
|
||||||
|
|
||||||
|
<p>将字符串格式化成时间,`format` 参数格式参考注<sup>1</sup></p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func FormatStrToTime(str, format string) (time.Time, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
time := datetime.FormatStrToTime("2006-01-02 15:04:05", "yyyy/mm/dd hh:mm:ss")
|
||||||
|
fmt.Println(time)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="NewUnixNow">NewUnixNow</span>
|
||||||
|
|
||||||
|
<p>创建一个当前时间的unix时间戳</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
func NewUnixNow() *theTime
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm := datetime.NewUnixNow()
|
||||||
|
fmt.Println(tm) //&{1647597438}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="NewUnix">NewUnix</span>
|
||||||
|
|
||||||
|
<p>创建一个unix时间戳</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
func NewUnix(unix int64) *theTime
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm := datetime.NewUnix(1647597438)
|
||||||
|
fmt.Println(tm) //&{1647597438}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="NewFormat">NewFormat</span>
|
||||||
|
|
||||||
|
<p>创建一个yyyy-mm-dd hh:mm:ss格式时间字符串的unix时间戳</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
func NewFormat(t string) (*theTime, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, err := datetime.NewFormat("2022-03-18 17:04:05")
|
||||||
|
fmt.Println(tm) //&{1647594245}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="NewISO8601">NewISO8601</span>
|
||||||
|
|
||||||
|
<p>创建一个iso8601格式时间字符串的unix时间戳</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type theTime struct {
|
||||||
|
unix int64
|
||||||
|
}
|
||||||
|
func NewISO8601(iso8601 string) (*theTime, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
|
||||||
|
fmt.Println(tm) //&{1136214245}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToUnix">ToUnix</span>
|
||||||
|
|
||||||
|
<p>返回unix时间戳</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (t *theTime) ToUnix() int64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm := datetime.NewUnixNow()
|
||||||
|
fmt.Println(tm.ToUnix()) //1647597438
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToFormat">ToFormat</span>
|
||||||
|
|
||||||
|
<p>返回格式'yyyy-mm-dd hh:mm:ss'的日期字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (t *theTime) ToFormat() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
|
||||||
|
fmt.Println(tm.ToFormat()) //"2022-03-18 17:04:05"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToFormatForTpl">ToFormatForTpl</span>
|
||||||
|
|
||||||
|
<p>返回tpl格式指定的日期字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (t *theTime) ToFormatForTpl(tpl string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
|
||||||
|
ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
|
||||||
|
fmt.Println(ts) //"2022/03/18 17:04:05"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ToIso8601">ToIso8601</span>
|
||||||
|
|
||||||
|
<p>返回iso8601日期字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (t *theTime) ToIso8601() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
|
||||||
|
ts := tm.ToIso8601()
|
||||||
|
fmt.Println(ts) //"2006-01-02T23:04:05+08:00"
|
||||||
|
}
|
||||||
|
```
|
||||||
470
docs/fileutil.md
Normal file
470
docs/fileutil.md
Normal file
@@ -0,0 +1,470 @@
|
|||||||
|
# Fileutil
|
||||||
|
|
||||||
|
Package fileutil implements some basic functions for file operations.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/fileutil/file.go](https://github.com/duke-git/lancet/blob/v1/fileutil/file.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [ClearFile](#ClearFile)
|
||||||
|
- [CreateFile](#CreateFile)
|
||||||
|
- [CreateDir](#CreateDir)
|
||||||
|
- [CopyFile](#CopyFile)
|
||||||
|
- [FileMode](#FileMode)
|
||||||
|
- [MiMeType](#MiMeType)
|
||||||
|
- [IsExist](#IsExist)
|
||||||
|
- [IsLink](#IsLink)
|
||||||
|
- [IsDir](#IsDir)
|
||||||
|
- [ListFileNames](#ListFileNames)
|
||||||
|
- [RemoveFile](#RemoveFile)
|
||||||
|
- [ReadFileToString](#ReadFileToString)
|
||||||
|
- [ReadFileByLine](#ReadFileByLine)
|
||||||
|
- [Zip](#Zip)
|
||||||
|
- [UnZip](#UnZip)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="ClearFile">ClearFile</span>
|
||||||
|
|
||||||
|
<p>Clear the file content, write empty string to the file.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ClearFile(path string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.ClearFile("./test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CreateDir">CreateDir</span>
|
||||||
|
|
||||||
|
<p>Create directory in absolute path. param `absPath` like /a/, /a/b/.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CreateDir(absPath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.CreateDir("/a/")
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CreateFile">CreateFile</span>
|
||||||
|
|
||||||
|
<p>Create file in path. return true if create succeed.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CreateFile(path string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isCreatedSucceed := fileutil.CreateFile("./test.txt")
|
||||||
|
fmt.Println(isCreatedSucceed)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CopyFile">CopyFile</span>
|
||||||
|
|
||||||
|
<p>Copy src file to dest file. If dest file exist will overwrite it.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CopyFile(srcFilePath string, dstFilePath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="FileMode">FileMode</span>
|
||||||
|
|
||||||
|
<p>Return file mode infomation.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func FileMode(path string) (fs.FileMode, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
mode, err := fileutil.FileMode("./test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
fmt.Println(mode)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="MiMeType">MiMeType</span>
|
||||||
|
|
||||||
|
<p>Get file mime type, 'file' param's type should be string or *os.File.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func MiMeType(file interface{}) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type1 := fileutil.MiMeType("./test.txt")
|
||||||
|
fmt.Println(type1) //text/plain; charset=utf-8
|
||||||
|
|
||||||
|
f, _ := os.Open("./file.go")
|
||||||
|
type2 := fileutil.MiMeType(f)
|
||||||
|
fmt.Println(type2) //text/plain; charset=utf-8
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsExist">IsExist</span>
|
||||||
|
|
||||||
|
<p>Checks if a file or directory exists.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsExist(path string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fileutil.CreateFile("./test.txt")
|
||||||
|
isFileExist := fileutil.IsExist("./test.txt")
|
||||||
|
fmt.Println(isFileExist) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsLink">IsLink</span>
|
||||||
|
|
||||||
|
<p>Checks if a file is symbol link or not.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsLink(path string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isLinkFile := fileutil.IsLink("./test.txt")
|
||||||
|
fmt.Println(isLinkFile) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsDir">IsDir</span>
|
||||||
|
|
||||||
|
<p>Checks if the path is directy or not.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsDir(path string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isDir := fileutil.IsDir("./")
|
||||||
|
fmt.Println(isDir) //true
|
||||||
|
|
||||||
|
isDir = fileutil.IsDir("./test.txt")
|
||||||
|
fmt.Println(isDir) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ListFileNames">ListFileNames</span>
|
||||||
|
|
||||||
|
<p>List all file names in given path.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ListFileNames(path string) ([]string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fileNames, _ := fileutil.ListFileNames("./")
|
||||||
|
fmt.Println(fileNames)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RemoveFile">RemoveFile</span>
|
||||||
|
|
||||||
|
<p>Remove the file of path.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RemoveFile(path string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.RemoveFile("./test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ReadFileToString">ReadFileToString</span>
|
||||||
|
|
||||||
|
<p>Return string of file content.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ReadFileToString(path string) (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
path := "./test.txt"
|
||||||
|
fileutil.CreateFile(path)
|
||||||
|
|
||||||
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
|
f.WriteString("hello world")
|
||||||
|
|
||||||
|
content, _ := fileutil.ReadFileToString(path)
|
||||||
|
fmt.Println(content) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ReadFileByLine">ReadFileByLine</span>
|
||||||
|
|
||||||
|
<p>Read file line by line, and return slice of lines</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ReadFileByLine(path string)([]string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
path := "./text.txt"
|
||||||
|
fileutil.CreateFile(path)
|
||||||
|
|
||||||
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
|
defer f.Close()
|
||||||
|
f.WriteString("hello\nworld")
|
||||||
|
|
||||||
|
contents, _ := fileutil.ReadFileByLine(path)
|
||||||
|
fmt.Println(contents) //[]string{"hello", "world"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Zip">Zip</span>
|
||||||
|
|
||||||
|
<p>Create a zip file of fpath, fpath could be a file or a directory.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Zip(fpath string, destPath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.Zip("./test.txt", "./test.zip")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UnZip">UnZip</span>
|
||||||
|
|
||||||
|
<p>Unzip the file and save it to dest path.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func UnZip(zipFile string, destPath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.Zip("./test.zip", "./unzip/test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
470
docs/fileutil_zh-CN.md
Normal file
470
docs/fileutil_zh-CN.md
Normal file
@@ -0,0 +1,470 @@
|
|||||||
|
# Fileutil
|
||||||
|
|
||||||
|
fileutil 包支持文件基本操作。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/fileutil/file.go](https://github.com/duke-git/lancet/blob/v1/fileutil/file.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [ClearFile](#ClearFile)
|
||||||
|
- [CreateFile](#CreateFile)
|
||||||
|
- [CreateDir](#CreateDir)
|
||||||
|
- [CopyFile](#CopyFile)
|
||||||
|
- [FileMode](#FileMode)
|
||||||
|
- [MiMeType](#MiMeType)
|
||||||
|
- [IsExist](#IsExist)
|
||||||
|
- [IsLink](#IsLink)
|
||||||
|
- [IsDir](#IsDir)
|
||||||
|
- [ListFileNames](#ListFileNames)
|
||||||
|
- [RemoveFile](#RemoveFile)
|
||||||
|
- [ReadFileToString](#ReadFileToString)
|
||||||
|
- [ReadFileByLine](#ReadFileByLine)
|
||||||
|
- [Zip](#Zip)
|
||||||
|
- [UnZip](#UnZip)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
### <span id="ClearFile">ClearFile</span>
|
||||||
|
|
||||||
|
<p>清空文件内容</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ClearFile(path string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.ClearFile("./test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CreateDir">CreateDir</span>
|
||||||
|
|
||||||
|
<p>使用绝对路径创建嵌套目录,例如/a/, /a/b/</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CreateDir(absPath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.CreateDir("/a/")
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CreateFile">CreateFile</span>
|
||||||
|
|
||||||
|
<p>创建文件,创建成功返回true, 否则返回false</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CreateFile(path string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isCreatedSucceed := fileutil.CreateFile("./test.txt")
|
||||||
|
fmt.Println(isCreatedSucceed)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CopyFile">CopyFile</span>
|
||||||
|
|
||||||
|
<p>拷贝文件,会覆盖原有的拷贝文件</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CopyFile(srcFilePath string, dstFilePath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="FileMode">FileMode</span>
|
||||||
|
|
||||||
|
<p>获取文件mode信息</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func FileMode(path string) (fs.FileMode, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
mode, err := fileutil.FileMode("./test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
fmt.Println(mode)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="MiMeType">MiMeType</span>
|
||||||
|
|
||||||
|
<p>获取文件mime类型, 'file'参数的类型必须是string或者*os.File</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func MiMeType(file interface{}) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type1 := fileutil.MiMeType("./test.txt")
|
||||||
|
fmt.Println(type1) //text/plain; charset=utf-8
|
||||||
|
|
||||||
|
f, _ := os.Open("./file.go")
|
||||||
|
type2 := fileutil.MiMeType(f)
|
||||||
|
fmt.Println(type2) //text/plain; charset=utf-8
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsExist">IsExist</span>
|
||||||
|
|
||||||
|
<p>判断文件或目录是否存在</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsExist(path string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fileutil.CreateFile("./test.txt")
|
||||||
|
isFileExist := fileutil.IsExist("./test.txt")
|
||||||
|
fmt.Println(isFileExist) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsLink">IsLink</span>
|
||||||
|
|
||||||
|
<p>判断文件是否是符号链接</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsLink(path string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isLinkFile := fileutil.IsLink("./test.txt")
|
||||||
|
fmt.Println(isLinkFile) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsDir">IsDir</span>
|
||||||
|
|
||||||
|
<p>判断目录是否存在</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsDir(path string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isDir := fileutil.IsDir("./")
|
||||||
|
fmt.Println(isDir) //true
|
||||||
|
|
||||||
|
isDir = fileutil.IsDir("./test.txt")
|
||||||
|
fmt.Println(isDir) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ListFileNames">ListFileNames</span>
|
||||||
|
|
||||||
|
<p>返回目录下所有文件名</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ListFileNames(path string) ([]string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fileNames, _ := fileutil.ListFileNames("./")
|
||||||
|
fmt.Println(fileNames)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RemoveFile">RemoveFile</span>
|
||||||
|
|
||||||
|
<p>删除文件</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RemoveFile(path string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.RemoveFile("./test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ReadFileToString">ReadFileToString</span>
|
||||||
|
|
||||||
|
<p>读取文件内容并返回字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ReadFileToString(path string) (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
path := "./test.txt"
|
||||||
|
fileutil.CreateFile(path)
|
||||||
|
|
||||||
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
|
f.WriteString("hello world")
|
||||||
|
|
||||||
|
content, _ := fileutil.ReadFileToString(path)
|
||||||
|
fmt.Println(content) //hello world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ReadFileByLine">ReadFileByLine</span>
|
||||||
|
|
||||||
|
<p>按行读取文件内容,返回字符串切片包含每一行</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ReadFileByLine(path string)([]string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
path := "./text.txt"
|
||||||
|
fileutil.CreateFile(path)
|
||||||
|
|
||||||
|
f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
|
||||||
|
defer f.Close()
|
||||||
|
f.WriteString("hello\nworld")
|
||||||
|
|
||||||
|
contents, _ := fileutil.ReadFileByLine(path)
|
||||||
|
fmt.Println(contents) //[]string{"hello", "world"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Zip">Zip</span>
|
||||||
|
|
||||||
|
<p>zip压缩文件, fpath参数可以是文件或目录</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Zip(fpath string, destPath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.Zip("./test.txt", "./test.zip")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UnZip">UnZip</span>
|
||||||
|
|
||||||
|
<p>zip解压缩文件并保存在目录中</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func UnZip(zipFile string, destPath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/fileutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := fileutil.Zip("./test.zip", "./unzip/test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
56
docs/formatter.md
Normal file
56
docs/formatter.md
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Formatter
|
||||||
|
|
||||||
|
formatter contains some functions for data formatting.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/formatter/formatter.go](https://github.com/duke-git/lancet/blob/v1/formatter/formatter.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/formatter"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [Comma](#Comma)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="Comma">Comma</span>
|
||||||
|
|
||||||
|
<p>Add comma to number by every 3 numbers from right. ahead by symbol char.
|
||||||
|
Param should be number or numberic string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Comma(v interface{}, symbol string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/formatter"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(formatter.Comma("12345", "")) // "12,345"
|
||||||
|
fmt.Println(formatter.Comma(12345.67, "¥")) // "¥12,345.67"
|
||||||
|
}
|
||||||
|
```
|
||||||
55
docs/formatter_zh-CN.md
Normal file
55
docs/formatter_zh-CN.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# Formatter
|
||||||
|
|
||||||
|
formatter 格式化器包含一些数据格式化处理方法。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/formatter/formatter.go](https://github.com/duke-git/lancet/blob/v1/formatter/formatter.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/formatter"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [Comma](#Comma)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
### <span id="Comma">Comma</span>
|
||||||
|
|
||||||
|
<p>用逗号每隔3位分割数字/字符串,签名添加符号。参数必须是数字或者可以转为数字的字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Comma(v interface{}, symbol string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/formatter"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(formatter.Comma("12345", "")) // "12,345"
|
||||||
|
fmt.Println(formatter.Comma(12345.67, "¥")) // "¥12,345.67"
|
||||||
|
}
|
||||||
|
```
|
||||||
402
docs/function.md
Normal file
402
docs/function.md
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
# Function
|
||||||
|
|
||||||
|
Package function can control the flow of function execution and support part of functional programming.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/function/function.go](https://github.com/duke-git/lancet/blob/v1/function/function.go)
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/function/watcher.go](https://github.com/duke-git/lancet/blob/v1/function/watcher.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [After](#After)
|
||||||
|
- [Before](#Before)
|
||||||
|
- [Curry](#Curry)
|
||||||
|
- [Compose](#Compose)
|
||||||
|
- [Debounced](#Debounced)
|
||||||
|
- [Delay](#Delay)
|
||||||
|
- [Pipeline](#Pipeline)
|
||||||
|
- [Schedule](#Schedule)
|
||||||
|
- [Watcher](#Watcher)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="After">After</span>
|
||||||
|
|
||||||
|
<p>Creates a function that invokes given func once it's called n or more times.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func After(n int, fn interface{}) func(args ...interface{}) []reflect.Value
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
arr := []string{"a", "b"}
|
||||||
|
f := function.After(len(arr), func(i int) int {
|
||||||
|
fmt.Println("last print")
|
||||||
|
return i
|
||||||
|
})
|
||||||
|
|
||||||
|
type cb func(args ...interface{}) []reflect.Value
|
||||||
|
print := func(i int, s string, fn cb) {
|
||||||
|
fmt.Printf("arr[%d] is %s \n", i, s)
|
||||||
|
fn(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("arr is", arr)
|
||||||
|
for i := 0; i < len(arr); i++ {
|
||||||
|
print(i, arr[i], f)
|
||||||
|
}
|
||||||
|
|
||||||
|
//output:
|
||||||
|
// arr is [a b]
|
||||||
|
// arr[0] is a
|
||||||
|
// arr[1] is b
|
||||||
|
// last print
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Before">Before</span>
|
||||||
|
|
||||||
|
<p>creates a function that invokes func once it's called less than n times.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Before(n int, fn interface{}) func(args ...interface{}) []reflect.Value
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
"github.com/duke-git/lancet/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
assert := internal.NewAssert(t, "TestBefore")
|
||||||
|
|
||||||
|
arr := []string{"a", "b", "c", "d", "e"}
|
||||||
|
f := function.Before(3, func(i int) int {
|
||||||
|
return i
|
||||||
|
})
|
||||||
|
|
||||||
|
var res []int64
|
||||||
|
type cb func(args ...interface{}) []reflect.Value
|
||||||
|
appendStr := func(i int, s string, fn cb) {
|
||||||
|
v := fn(i)
|
||||||
|
res = append(res, v[0].Int())
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(arr); i++ {
|
||||||
|
appendStr(i, arr[i], f)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := []int64{0, 1, 2, 2, 2}
|
||||||
|
assert.Equal(expected, res)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Curry">Curry</span>
|
||||||
|
|
||||||
|
<p>Make a curry function.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Fn func(...interface{}) interface{}
|
||||||
|
func (f Fn) Curry(i interface{}) func(...interface{}) interface{}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
add := func(a, b int) int {
|
||||||
|
return a + b
|
||||||
|
}
|
||||||
|
var addCurry function.Fn = func(values ...interface{}) interface{} {
|
||||||
|
return add(values[0].(int), values[1].(int))
|
||||||
|
}
|
||||||
|
add1 := addCurry.Curry(1)
|
||||||
|
result := add1(2)
|
||||||
|
fmt.Println(result) //3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Compose">Compose</span>
|
||||||
|
|
||||||
|
<p>Compose the function list from right to left, then return the composed function.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Compose(fnList ...func(...interface{}) interface{}) func(...interface{}) interface{}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
add1 := func(v ...interface{}) interface{} {
|
||||||
|
return v[0].(int) + 1
|
||||||
|
}
|
||||||
|
add2 := func(v ...interface{}) interface{} {
|
||||||
|
return v[0].(int) + 2
|
||||||
|
}
|
||||||
|
|
||||||
|
add3 := function.Compose(add1, add2)
|
||||||
|
result := add3(1)
|
||||||
|
|
||||||
|
fmt.Println(result) //4
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Debounced">Debounced</span>
|
||||||
|
|
||||||
|
<p>Creates a debounced function that delays invoking fn until after wait duration have elapsed since the last time the debounced function was invoked.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Debounced(fn func(), duration time.Duration) func()
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
count := 0
|
||||||
|
add := func() {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
debouncedAdd := function.Debounced(add, 50*time.Microsecond)
|
||||||
|
function.debouncedAdd()
|
||||||
|
function.debouncedAdd()
|
||||||
|
function.debouncedAdd()
|
||||||
|
function.debouncedAdd()
|
||||||
|
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
fmt.Println(count) //1
|
||||||
|
|
||||||
|
function.debouncedAdd()
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
fmt.Println(count) //2
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Delay">Delay</span>
|
||||||
|
|
||||||
|
<p>Invoke function after delayed time.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Delay(delay time.Duration, fn interface{}, args ...interface{})
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var print = func(s string) {
|
||||||
|
fmt.Println(count) //test delay
|
||||||
|
}
|
||||||
|
function.Delay(2*time.Second, print, "test delay")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Schedule">Schedule</span>
|
||||||
|
|
||||||
|
<p>Invoke function every duration time, until close the returned bool chan.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Schedule(d time.Duration, fn interface{}, args ...interface{}) chan bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var res []string
|
||||||
|
appendStr := func(s string) {
|
||||||
|
res = append(res, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
stop := function.Schedule(1*time.Second, appendStr, "*")
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
close(stop)
|
||||||
|
|
||||||
|
fmt.Println(res) //[* * * * *]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Pipeline">Pipeline</span>
|
||||||
|
|
||||||
|
<p>Pipeline takes a list of functions and returns a function whose param will be passed into
|
||||||
|
the functions one by one.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Pipeline(funcs ...func(interface{}) interface{}) func(interface{}) interface{}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
addOne := func(x interface{}) interface{} {
|
||||||
|
return x.(int) + 1
|
||||||
|
}
|
||||||
|
double := func(x interface{}) interface{} {
|
||||||
|
return 2 * x.(int)
|
||||||
|
}
|
||||||
|
square := func(x interface{}) interface{} {
|
||||||
|
return x.(int) * x.(int)
|
||||||
|
}
|
||||||
|
|
||||||
|
f := function.Pipeline(addOne, double, square)
|
||||||
|
|
||||||
|
result := fn(2)
|
||||||
|
|
||||||
|
fmt.Println(result)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 36
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Watcher">Watcher</span>
|
||||||
|
|
||||||
|
<p>Watcher is used for record code excution time. can start/stop/reset the watch timer. get the elapsed time of function execution.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Watcher struct {
|
||||||
|
startTime int64
|
||||||
|
stopTime int64
|
||||||
|
excuting bool
|
||||||
|
}
|
||||||
|
func (w *Watcher) Start() //start the watcher
|
||||||
|
func (w *Watcher) Stop() //stop the watcher
|
||||||
|
func (w *Watcher) Reset() //reset the watcher
|
||||||
|
func (w *Watcher) GetElapsedTime() time.Duration //get the elapsed time of function execution
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
w := &function.Watcher{}
|
||||||
|
w.Start()
|
||||||
|
|
||||||
|
longRunningTask()
|
||||||
|
|
||||||
|
fmt.Println(w.excuting) //true
|
||||||
|
|
||||||
|
w.Stop()
|
||||||
|
|
||||||
|
eapsedTime := w.GetElapsedTime().Milliseconds()
|
||||||
|
fmt.Println(eapsedTime)
|
||||||
|
|
||||||
|
w.Reset()
|
||||||
|
|
||||||
|
fmt.Println(w.excuting) //false
|
||||||
|
|
||||||
|
fmt.Println(w.startTime) //0
|
||||||
|
fmt.Println(w.stopTime) //0
|
||||||
|
}
|
||||||
|
|
||||||
|
func longRunningTask() {
|
||||||
|
var slice []int64
|
||||||
|
for i := 0; i < 10000000; i++ {
|
||||||
|
slice = append(slice, int64(i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
401
docs/function_zh-CN.md
Normal file
401
docs/function_zh-CN.md
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
# Function
|
||||||
|
|
||||||
|
function 函数包控制函数执行流程,包含部分函数式编程。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/function/function.go](https://github.com/duke-git/lancet/blob/v1/function/function.go)
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/function/watcher.go](https://github.com/duke-git/lancet/blob/v1/function/watcher.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [After](#After)
|
||||||
|
- [Before](#Before)
|
||||||
|
- [Curry](#Curry)
|
||||||
|
- [Compose](#Compose)
|
||||||
|
- [Debounced](#Debounced)
|
||||||
|
- [Delay](#Delay)
|
||||||
|
- [Pipeline](#Pipeline)
|
||||||
|
- [Schedule](#Schedule)
|
||||||
|
- [Watcher](#Watcher)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
### <span id="After">After</span>
|
||||||
|
|
||||||
|
<p>创建一个函数,当他被调用n或更多次之后将马上触发fn</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func After(n int, fn interface{}) func(args ...interface{}) []reflect.Value
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
arr := []string{"a", "b"}
|
||||||
|
f := function.After(len(arr), func(i int) int {
|
||||||
|
fmt.Println("last print")
|
||||||
|
return i
|
||||||
|
})
|
||||||
|
|
||||||
|
type cb func(args ...interface{}) []reflect.Value
|
||||||
|
print := func(i int, s string, fn cb) {
|
||||||
|
fmt.Printf("arr[%d] is %s \n", i, s)
|
||||||
|
fn(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("arr is", arr)
|
||||||
|
for i := 0; i < len(arr); i++ {
|
||||||
|
print(i, arr[i], f)
|
||||||
|
}
|
||||||
|
|
||||||
|
//output:
|
||||||
|
// arr is [a b]
|
||||||
|
// arr[0] is a
|
||||||
|
// arr[1] is b
|
||||||
|
// last print
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Before">Before</span>
|
||||||
|
|
||||||
|
<p>创建一个函数,调用次数不超过n次,之后再调用这个函数,将返回一次最后调用fn的结果</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Before(n int, fn interface{}) func(args ...interface{}) []reflect.Value
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
"github.com/duke-git/lancet/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
assert := internal.NewAssert(t, "TestBefore")
|
||||||
|
|
||||||
|
arr := []string{"a", "b", "c", "d", "e"}
|
||||||
|
f := function.Before(3, func(i int) int {
|
||||||
|
return i
|
||||||
|
})
|
||||||
|
|
||||||
|
var res []int64
|
||||||
|
type cb func(args ...interface{}) []reflect.Value
|
||||||
|
appendStr := func(i int, s string, fn cb) {
|
||||||
|
v := fn(i)
|
||||||
|
res = append(res, v[0].Int())
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(arr); i++ {
|
||||||
|
appendStr(i, arr[i], f)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := []int64{0, 1, 2, 2, 2}
|
||||||
|
assert.Equal(expected, res)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Curry">Curry</span>
|
||||||
|
|
||||||
|
<p>创建一个柯里化的函数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Fn func(...interface{}) interface{}
|
||||||
|
func (f Fn) Curry(i interface{}) func(...interface{}) interface{}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
add := func(a, b int) int {
|
||||||
|
return a + b
|
||||||
|
}
|
||||||
|
var addCurry function.Fn = func(values ...interface{}) interface{} {
|
||||||
|
return add(values[0].(int), values[1].(int))
|
||||||
|
}
|
||||||
|
add1 := addCurry.Curry(1)
|
||||||
|
result := add1(2)
|
||||||
|
fmt.Println(result) //3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Compose">Compose</span>
|
||||||
|
|
||||||
|
<p>从右至左组合函数列表fnList, 返回组合后的函数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Compose(fnList ...func(...interface{}) interface{}) func(...interface{}) interface{}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
add1 := func(v ...interface{}) interface{} {
|
||||||
|
return v[0].(int) + 1
|
||||||
|
}
|
||||||
|
add2 := func(v ...interface{}) interface{} {
|
||||||
|
return v[0].(int) + 2
|
||||||
|
}
|
||||||
|
|
||||||
|
add3 := function.Compose(add1, add2)
|
||||||
|
result := add3(1)
|
||||||
|
|
||||||
|
fmt.Println(result) //4
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Debounced">Debounced</span>
|
||||||
|
|
||||||
|
<p>创建一个 debounced 函数,该函数延迟调用 fn 直到自上次调用 debounced 函数后等待持续时间过去。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Debounced(fn func(), duration time.Duration) func()
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
count := 0
|
||||||
|
add := func() {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
debouncedAdd := function.Debounced(add, 50*time.Microsecond)
|
||||||
|
function.debouncedAdd()
|
||||||
|
function.debouncedAdd()
|
||||||
|
function.debouncedAdd()
|
||||||
|
function.debouncedAdd()
|
||||||
|
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
fmt.Println(count) //1
|
||||||
|
|
||||||
|
function.debouncedAdd()
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
fmt.Println(count) //2
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Delay">Delay</span>
|
||||||
|
|
||||||
|
<p>延迟delay时间后调用函数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Delay(delay time.Duration, fn interface{}, args ...interface{})
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var print = func(s string) {
|
||||||
|
fmt.Println(count) //test delay
|
||||||
|
}
|
||||||
|
function.Delay(2*time.Second, print, "test delay")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Schedule">Schedule</span>
|
||||||
|
|
||||||
|
<p>每次持续时间调用函数,直到关闭返回的 bool chan</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Schedule(d time.Duration, fn interface{}, args ...interface{}) chan bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var res []string
|
||||||
|
appendStr := func(s string) {
|
||||||
|
res = append(res, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
stop := function.Schedule(1*time.Second, appendStr, "*")
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
close(stop)
|
||||||
|
|
||||||
|
fmt.Println(res) //[* * * * *]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Pipeline">Pipeline</span>
|
||||||
|
|
||||||
|
<p>管道执行多个函数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Pipeline(funcs ...func(interface{}) interface{}) func(interface{}) interface{}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
addOne := func(x interface{}) interface{} {
|
||||||
|
return x.(int) + 1
|
||||||
|
}
|
||||||
|
double := func(x interface{}) interface{} {
|
||||||
|
return 2 * x.(int)
|
||||||
|
}
|
||||||
|
square := func(x interface{}) interface{} {
|
||||||
|
return x.(int) * x.(int)
|
||||||
|
}
|
||||||
|
|
||||||
|
f := function.Pipeline(addOne, double, square)
|
||||||
|
|
||||||
|
result := fn(2)
|
||||||
|
|
||||||
|
fmt.Println(result)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 36
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Watcher">Watcher</span>
|
||||||
|
|
||||||
|
<p>Watcher 用于记录代码执行时间。可以启动/停止/重置手表定时器。获取函数执行的时间。 </p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Watcher struct {
|
||||||
|
startTime int64
|
||||||
|
stopTime int64
|
||||||
|
excuting bool
|
||||||
|
}
|
||||||
|
func (w *Watcher) Start() //start the watcher
|
||||||
|
func (w *Watcher) Stop() //stop the watcher
|
||||||
|
func (w *Watcher) Reset() //reset the watcher
|
||||||
|
func (w *Watcher) GetElapsedTime() time.Duration //get the elapsed time of function execution
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
w := &function.Watcher{}
|
||||||
|
w.Start()
|
||||||
|
|
||||||
|
longRunningTask()
|
||||||
|
|
||||||
|
fmt.Println(w.excuting) //true
|
||||||
|
|
||||||
|
w.Stop()
|
||||||
|
|
||||||
|
eapsedTime := w.GetElapsedTime().Milliseconds()
|
||||||
|
fmt.Println(eapsedTime)
|
||||||
|
|
||||||
|
w.Reset()
|
||||||
|
|
||||||
|
fmt.Println(w.excuting) //false
|
||||||
|
|
||||||
|
fmt.Println(w.startTime) //0
|
||||||
|
fmt.Println(w.stopTime) //0
|
||||||
|
}
|
||||||
|
|
||||||
|
func longRunningTask() {
|
||||||
|
var slice []int64
|
||||||
|
for i := 0; i < 10000000; i++ {
|
||||||
|
slice = append(slice, int64(i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
232
docs/mathutil.md
Normal file
232
docs/mathutil.md
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
# Mathutil
|
||||||
|
|
||||||
|
Package mathutil implements some functions for math calculation.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/mathutil/mathutil.go](https://github.com/duke-git/lancet/blob/v1/mathutil/mathutil.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [Exponent](#Exponent)
|
||||||
|
- [Fibonacci](#Fibonacci)
|
||||||
|
- [Factorial](#Factorial)
|
||||||
|
- [Percent](#Percent)
|
||||||
|
- [RoundToFloat](#RoundToFloat)
|
||||||
|
- [RoundToString](#RoundToString)
|
||||||
|
- [TruncRound](#TruncRound)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="Exponent">Exponent</span>
|
||||||
|
|
||||||
|
<p>Calculate x to the nth power.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Exponent(x, n int64) int64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.Exponent(10, 0)) //1
|
||||||
|
fmt.Println(mathutil.Exponent(10, 1)) //10
|
||||||
|
fmt.Println(mathutil.Exponent(10, 2)) //100
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Fibonacci">Fibonacci</span>
|
||||||
|
|
||||||
|
<p>Calculate the nth number of fibonacci sequence.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Fibonacci(first, second, n int) int
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 1)) //1
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 2)) //1
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 3)) //2
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 4)) //3
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 5)) //5
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Factorial">Factorial</span>
|
||||||
|
|
||||||
|
<p>Calculate the factorial of x.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Factorial(x uint) uint
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.Factorial(0)) //1
|
||||||
|
fmt.Println(mathutil.Factorial(1)) //1
|
||||||
|
fmt.Println(mathutil.Factorial(2)) //2
|
||||||
|
fmt.Println(mathutil.Factorial(3)) //6
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Percent">Percent</span>
|
||||||
|
|
||||||
|
<p>calculate the percentage of val to total, retain n decimal places.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Percent(val, total float64, n int) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.Percent(1, 2, 2)) //1
|
||||||
|
fmt.Println(mathutil.Percent(0.1, 0.3, 2)) //33.33
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RoundToFloat">RoundToFloat</span>
|
||||||
|
|
||||||
|
<p>Round float up to n decimal places.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RoundToFloat(x float64, n int) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0, 0)) //0
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0, 1)) //0
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0.124, 2)) //0.12
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0.125, 2)) //0.13
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0.125, 3)) //0.125
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RoundToString">RoundToString</span>
|
||||||
|
|
||||||
|
<p>Round float up to n decimal places. will return string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RoundToString(x float64, n int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.RoundToString(0, 0)) //"0"
|
||||||
|
fmt.Println(mathutil.RoundToString(0, 1)) //"0.0:
|
||||||
|
fmt.Println(mathutil.RoundToString(0.124, 2)) //"0.12"
|
||||||
|
fmt.Println(mathutil.RoundToString(0.125, 2)) //"0.13"
|
||||||
|
fmt.Println(mathutil.RoundToString(0.125, 3)) //"0.125"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="TruncRound">TruncRound</span>
|
||||||
|
|
||||||
|
<p>Round float off n decimal places.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func TruncRound(x float64, n int) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.TruncRound(0, 0)) //0
|
||||||
|
fmt.Println(mathutil.TruncRound(0, 1)) //0
|
||||||
|
fmt.Println(mathutil.TruncRound(0.124, 2)) //0.12
|
||||||
|
fmt.Println(mathutil.TruncRound(0.125, 2)) //0.12
|
||||||
|
fmt.Println(mathutil.TruncRound(0.125, 3)) //0.125
|
||||||
|
}
|
||||||
|
```
|
||||||
233
docs/mathutil_zh-CN.md
Normal file
233
docs/mathutil_zh-CN.md
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
# Mathutil
|
||||||
|
|
||||||
|
mathutil 包实现了一些数学计算的函数.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/mathutil/mathutil.go](https://github.com/duke-git/lancet/blob/v1/mathutil/mathutil.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [Exponent](#Exponent)
|
||||||
|
- [Fibonacci](#Fibonacci)
|
||||||
|
- [Factorial](#Factorial)
|
||||||
|
|
||||||
|
- [Percent](#Percent)
|
||||||
|
- [RoundToFloat](#RoundToFloat)
|
||||||
|
- [RoundToString](#RoundToString)
|
||||||
|
- [TruncRound](#TruncRound)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="Exponent">Exponent</span>
|
||||||
|
|
||||||
|
<p>指数计算(x的n次方)</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Exponent(x, n int64) int64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.Exponent(10, 0)) //1
|
||||||
|
fmt.Println(mathutil.Exponent(10, 1)) //10
|
||||||
|
fmt.Println(mathutil.Exponent(10, 2)) //100
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Fibonacci">Fibonacci</span>
|
||||||
|
|
||||||
|
<p>计算斐波那契数列的第n个数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Fibonacci(first, second, n int) int
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 1)) //1
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 2)) //1
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 3)) //2
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 4)) //3
|
||||||
|
fmt.Println(mathutil.Fibonacci(1, 1, 5)) //5
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Factorial">Factorial</span>
|
||||||
|
|
||||||
|
<p>计算阶乘</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Factorial(x uint) uint
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.Factorial(0)) //1
|
||||||
|
fmt.Println(mathutil.Factorial(1)) //1
|
||||||
|
fmt.Println(mathutil.Factorial(2)) //2
|
||||||
|
fmt.Println(mathutil.Factorial(3)) //6
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Percent">Percent</span>
|
||||||
|
|
||||||
|
<p>计算百分比,保留n位小数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Percent(val, total float64, n int) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.Percent(1, 2, 2)) //1
|
||||||
|
fmt.Println(mathutil.Percent(0.1, 0.3, 2)) //33.33
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RoundToFloat">RoundToFloat</span>
|
||||||
|
|
||||||
|
<p>四舍五入,保留n位小数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RoundToFloat(x float64, n int) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0, 0)) //0
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0, 1)) //0
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0.124, 2)) //0.12
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0.125, 2)) //0.13
|
||||||
|
fmt.Println(mathutil.RoundToFloat(0.125, 3)) //0.125
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RoundToString">RoundToString</span>
|
||||||
|
|
||||||
|
<p>四舍五入,保留n位小数,返回字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RoundToString(x float64, n int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.RoundToString(0, 0)) //"0"
|
||||||
|
fmt.Println(mathutil.RoundToString(0, 1)) //"0.0:
|
||||||
|
fmt.Println(mathutil.RoundToString(0.124, 2)) //"0.12"
|
||||||
|
fmt.Println(mathutil.RoundToString(0.125, 2)) //"0.13"
|
||||||
|
fmt.Println(mathutil.RoundToString(0.125, 3)) //"0.125"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="TruncRound">TruncRound</span>
|
||||||
|
|
||||||
|
<p>截短n位小数(不进行四舍五入)</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func TruncRound(x float64, n int) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(mathutil.TruncRound(0, 0)) //0
|
||||||
|
fmt.Println(mathutil.TruncRound(0, 1)) //0
|
||||||
|
fmt.Println(mathutil.TruncRound(0.124, 2)) //0.12
|
||||||
|
fmt.Println(mathutil.TruncRound(0.125, 2)) //0.12
|
||||||
|
fmt.Println(mathutil.TruncRound(0.125, 3)) //0.125
|
||||||
|
}
|
||||||
|
```
|
||||||
852
docs/netutil.md
Normal file
852
docs/netutil.md
Normal file
@@ -0,0 +1,852 @@
|
|||||||
|
# Netutil
|
||||||
|
|
||||||
|
Package netutil contains functions to get net information and send http request.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/netutil/net.go](https://github.com/duke-git/lancet/blob/v1/netutil/net.go)
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/netutil/http_client.go](https://github.com/duke-git/lancet/blob/v1/netutil/http_client.go)
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/netutil/http.go](https://github.com/duke-git/lancet/blob/v1/netutil/http.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [ConvertMapToQueryString](#ConvertMapToQueryString)
|
||||||
|
- [EncodeUrl](#EncodeUrl)
|
||||||
|
- [GetInternalIp](#GetInternalIp)
|
||||||
|
- [GetIps](#GetIps)
|
||||||
|
- [GetMacAddrs](#GetMacAddrs)
|
||||||
|
- [GetPublicIpInfo](#GetPublicIpInfo)
|
||||||
|
- [GetRequestPublicIp](#GetRequestPublicIp)
|
||||||
|
- [IsPublicIP](#IsPublicIP)
|
||||||
|
- [IsInternalIP](#IsInternalIP)
|
||||||
|
- [HttpRequest](#HttpRequest)
|
||||||
|
- [HttpClient](#HttpClient)
|
||||||
|
- [SendRequest](#SendRequest)
|
||||||
|
- [DecodeResponse](#DecodeResponse)
|
||||||
|
- [StructToUrlValues](#StructToUrlValues)
|
||||||
|
- [HttpGet<sup>Deprecated</sup>](#HttpGet)
|
||||||
|
- [HttpDelete<sup>Deprecated</sup>](#HttpDelete)
|
||||||
|
- [HttpPost<sup>Deprecated</sup>](#HttpPost)
|
||||||
|
- [HttpPut<sup>Deprecated</sup>](#HttpPut)
|
||||||
|
- [HttpPatch<sup>Deprecated</sup>](#HttpPatch)
|
||||||
|
- [ParseHttpResponse](#ParseHttpResponse)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="ConvertMapToQueryString">ConvertMapToQueryString</span>
|
||||||
|
|
||||||
|
<p>Convert map to url query string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ConvertMapToQueryString(param map[string]interface{}) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var m = map[string]interface{}{
|
||||||
|
"c": 3,
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
}
|
||||||
|
qs := netutil.ConvertMapToQueryString(m)
|
||||||
|
|
||||||
|
fmt.Println(qs) //a=1&b=2&c=3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <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/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>
|
||||||
|
|
||||||
|
<p>Get internal ip information.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetInternalIp() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
internalIp := netutil.GetInternalIp()
|
||||||
|
ip := net.ParseIP(internalIp)
|
||||||
|
|
||||||
|
fmt.Println(ip) //192.168.1.9
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetIps">GetIps</span>
|
||||||
|
|
||||||
|
<p>Get all ipv4 list.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetIps() []string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ips := netutil.GetIps()
|
||||||
|
fmt.Println(ips) //[192.168.1.9]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetMacAddrs">GetMacAddrs</span>
|
||||||
|
|
||||||
|
<p>Get all mac addresses list.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetMacAddrs() []string {
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
addrs := netutil.GetMacAddrs()
|
||||||
|
fmt.Println(addrs)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetPublicIpInfo">GetPublicIpInfo</span>
|
||||||
|
|
||||||
|
<p>Get public ip information.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetPublicIpInfo() (*PublicIpInfo, error)
|
||||||
|
type PublicIpInfo struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
Country string `json:"country"`
|
||||||
|
CountryCode string `json:"countryCode"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
RegionName string `json:"regionName"`
|
||||||
|
City string `json:"city"`
|
||||||
|
Lat float64 `json:"lat"`
|
||||||
|
Lon float64 `json:"lon"`
|
||||||
|
Isp string `json:"isp"`
|
||||||
|
Org string `json:"org"`
|
||||||
|
As string `json:"as"`
|
||||||
|
Ip string `json:"query"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
publicIpInfo, err := netutil.GetPublicIpInfo()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(publicIpInfo)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <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/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>
|
||||||
|
|
||||||
|
<p>Checks if a ip is public or not.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsPublicIP(IP net.IP) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ip1 := net.ParseIP("192.168.0.1")
|
||||||
|
ip2 := net.ParseIP("36.112.24.10")
|
||||||
|
|
||||||
|
fmt.Println(netutil.IsPublicIP(ip1)) //false
|
||||||
|
fmt.Println(netutil.IsPublicIP(ip2)) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <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/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="HttpRequest">HttpRequest</span>
|
||||||
|
|
||||||
|
<p>HttpRequest is a struct used to abstract HTTP request entity.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type HttpRequest struct {
|
||||||
|
RawURL string
|
||||||
|
Method string
|
||||||
|
Headers http.Header
|
||||||
|
QueryParams url.Values
|
||||||
|
FormData url.Values
|
||||||
|
Body []byte
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
header := http.Header{}
|
||||||
|
header.Add("Content-Type", "multipart/form-data")
|
||||||
|
|
||||||
|
postData := url.Values{}
|
||||||
|
postData.Add("userId", "1")
|
||||||
|
postData.Add("title", "testItem")
|
||||||
|
|
||||||
|
request := &netutil.HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos",
|
||||||
|
Method: "POST",
|
||||||
|
Headers: header,
|
||||||
|
FormData: postData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpClient">HttpClient</span>
|
||||||
|
|
||||||
|
<p>HttpClient is a struct used to send HTTP request. It can be instanced with some configurations or none config.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type HttpClient struct {
|
||||||
|
*http.Client
|
||||||
|
TLS *tls.Config
|
||||||
|
Request *http.Request
|
||||||
|
Config HttpClientConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type HttpClientConfig struct {
|
||||||
|
SSLEnabled bool
|
||||||
|
TLSConfig *tls.Config
|
||||||
|
Compressed bool
|
||||||
|
HandshakeTimeout time.Duration
|
||||||
|
ResponseTimeout time.Duration
|
||||||
|
Verbose bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHttpClient() *HttpClient
|
||||||
|
|
||||||
|
func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
httpClientCfg := netutil.HttpClientConfig{
|
||||||
|
SSLEnabled: true,
|
||||||
|
HandshakeTimeout:10 * time.Second
|
||||||
|
}
|
||||||
|
httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SendRequest">SendRequest</span>
|
||||||
|
|
||||||
|
<p>Use HttpClient to send HTTP request.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
request := &netutil.HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos/1",
|
||||||
|
Method: "GET",
|
||||||
|
}
|
||||||
|
|
||||||
|
httpClient := netutil.NewHttpClient()
|
||||||
|
resp, err := httpClient.SendRequest(request)
|
||||||
|
if err != nil || resp.StatusCode != 200 {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Todo struct {
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Id int `json:"id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Completed bool `json:"completed"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var todo Todo
|
||||||
|
httpClient.DecodeResponse(resp, &todo)
|
||||||
|
|
||||||
|
fmt.Println(todo.Id) //1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DecodeResponse">DecodeResponse</span>
|
||||||
|
|
||||||
|
<p>Decode http response into target object.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (client *HttpClient) DecodeResponse(resp *http.Response, target interface{}) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
request := &netutil.HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos/1",
|
||||||
|
Method: "GET",
|
||||||
|
}
|
||||||
|
|
||||||
|
httpClient := netutil.NewHttpClient()
|
||||||
|
resp, err := httpClient.SendRequest(request)
|
||||||
|
if err != nil || resp.StatusCode != 200 {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Todo struct {
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Id int `json:"id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Completed bool `json:"completed"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var todo Todo
|
||||||
|
httpClient.DecodeResponse(resp, &todo)
|
||||||
|
|
||||||
|
fmt.Println(todo.Id) //1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="StructToUrlValues">StructToUrlValues</span>
|
||||||
|
|
||||||
|
<p>Convert struct to url values, only convert the field which is exported and has `json` tag.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func StructToUrlValues(targetStruct interface{}) url.Values
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type TodoQuery struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
}
|
||||||
|
todoQuery := TodoQuery{
|
||||||
|
Id: 1,
|
||||||
|
UserId: 2,
|
||||||
|
}
|
||||||
|
todoValues := netutil.StructToUrlValues(todoQuery)
|
||||||
|
|
||||||
|
fmt.Println(todoValues.Get("id")) //1
|
||||||
|
fmt.Println(todoValues.Get("userId")) //2
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpGet">HttpGet (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>Send http get request.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 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]interface{},
|
||||||
|
// params[2] is post body which type should be []byte.
|
||||||
|
// params[3] is http client which type should be http.Client.
|
||||||
|
func HttpGet(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := netutil.HttpGet(url, header)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpPost">HttpPost (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>Send http post request.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 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]interface{},
|
||||||
|
// params[2] is post body which type should be []byte.
|
||||||
|
// params[3] is http client which type should be http.Client.
|
||||||
|
func HttpPost(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
type Todo struct {
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
todo := Todo{1, "TestAddToDo"}
|
||||||
|
bodyParams, _ := json.Marshal(todo)
|
||||||
|
|
||||||
|
resp, err := netutil.HttpPost(url, header, nil, bodyParams)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpPut">HttpPut (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>Send http put request.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 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]interface{},
|
||||||
|
// params[2] is post body which type should be []byte.
|
||||||
|
// params[3] is http client which type should be http.Client.
|
||||||
|
func HttpPut(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
type Todo struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
todo := Todo{1, 1, "TestPutToDo"}
|
||||||
|
bodyParams, _ := json.Marshal(todo)
|
||||||
|
|
||||||
|
resp, err := netutil.HttpPut(url, header, nil, bodyParams)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpDelete">HttpDelete (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>Send http delete request.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 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]interface{},
|
||||||
|
// params[2] is post body which type should be []byte.
|
||||||
|
// params[3] is http client which type should be http.Client.
|
||||||
|
func HttpDelete(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
resp, err := netutil.HttpDelete(url)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpPatch">HttpPatch (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>Send http patch request.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 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]interface{},
|
||||||
|
// params[2] is post body which type should be []byte.
|
||||||
|
// params[3] is http client which type should be http.Client.
|
||||||
|
func HttpPatch(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
type Todo struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
todo := Todo{1, 1, "TestPatchToDo"}
|
||||||
|
bodyParams, _ := json.Marshal(todo)
|
||||||
|
|
||||||
|
resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ParseHttpResponse">ParseHttpResponse</span>
|
||||||
|
|
||||||
|
<p>Decode http response to specified interface.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ParseHttpResponse(resp *http.Response, obj interface{}) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := netutil.HttpGet(url, header)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Todo struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Completed bool `json:"completed"`
|
||||||
|
}
|
||||||
|
|
||||||
|
toDoResp := &Todo{}
|
||||||
|
err = netutil.ParseHttpResponse(resp, toDoResp)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(toDoResp)
|
||||||
|
}
|
||||||
|
```
|
||||||
851
docs/netutil_zh-CN.md
Normal file
851
docs/netutil_zh-CN.md
Normal file
@@ -0,0 +1,851 @@
|
|||||||
|
# Netutil
|
||||||
|
|
||||||
|
netutil 网络包支持获取 ip 地址,发送 http 请求。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/netutil/net.go](https://github.com/duke-git/lancet/blob/v1/netutil/net.go)
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/netutil/http_client.go](https://github.com/duke-git/lancet/blob/v1/netutil/http_client.go)
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/netutil/http.go](https://github.com/duke-git/lancet/blob/v1/netutil/http.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [ConvertMapToQueryString](#ConvertMapToQueryString)
|
||||||
|
- [EncodeUrl](#EncodeUrl)
|
||||||
|
- [GetInternalIp](#GetInternalIp)
|
||||||
|
- [GetIps](#GetIps)
|
||||||
|
- [GetMacAddrs](#GetMacAddrs)
|
||||||
|
- [GetPublicIpInfo](#GetPublicIpInfo)
|
||||||
|
- [GetRequestPublicIp](#GetRequestPublicIp)
|
||||||
|
- [IsPublicIP](#IsPublicIP)
|
||||||
|
- [IsInternalIP](#IsInternalIP)
|
||||||
|
- [HttpRequest](#HttpRequest)
|
||||||
|
- [HttpClient](#HttpClient)
|
||||||
|
- [SendRequest](#SendRequest)
|
||||||
|
- [DecodeResponse](#DecodeResponse)
|
||||||
|
- [StructToUrlValues](#StructToUrlValues)
|
||||||
|
- [HttpGet<sup>Deprecated</sup>](#HttpGet)
|
||||||
|
- [HttpDelete<sup>Deprecated</sup>](#HttpDelete)
|
||||||
|
- [HttpPost<sup>Deprecated</sup>](#HttpPost)
|
||||||
|
- [HttpPut<sup>Deprecated</sup>](#HttpPut)
|
||||||
|
- [HttpPatch<sup>Deprecated</sup>](#HttpPatch)
|
||||||
|
- [ParseHttpResponse](#ParseHttpResponse)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
### <span id="ConvertMapToQueryString">ConvertMapToQueryString</span>
|
||||||
|
|
||||||
|
<p>将map转换成http查询字符串.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ConvertMapToQueryString(param map[string]interface{}) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var m = map[string]interface{}{
|
||||||
|
"c": 3,
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
}
|
||||||
|
qs := netutil.ConvertMapToQueryString(m)
|
||||||
|
|
||||||
|
fmt.Println(qs) //a=1&b=2&c=3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <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/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>
|
||||||
|
|
||||||
|
<p>获取内部ip</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetInternalIp() string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
internalIp := netutil.GetInternalIp()
|
||||||
|
ip := net.ParseIP(internalIp)
|
||||||
|
|
||||||
|
fmt.Println(ip) //192.168.1.9
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetIps">GetIps</span>
|
||||||
|
|
||||||
|
<p>获取ipv4地址列表</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetIps() []string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ips := netutil.GetIps()
|
||||||
|
fmt.Println(ips) //[192.168.1.9]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetMacAddrs">GetMacAddrs</span>
|
||||||
|
|
||||||
|
<p>获取mac地址列</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetMacAddrs() []string {
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
addrs := netutil.GetMacAddrs()
|
||||||
|
fmt.Println(addrs)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetPublicIpInfo">GetPublicIpInfo</span>
|
||||||
|
|
||||||
|
<p>获取公网ip信息</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetPublicIpInfo() (*PublicIpInfo, error)
|
||||||
|
type PublicIpInfo struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
Country string `json:"country"`
|
||||||
|
CountryCode string `json:"countryCode"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
RegionName string `json:"regionName"`
|
||||||
|
City string `json:"city"`
|
||||||
|
Lat float64 `json:"lat"`
|
||||||
|
Lon float64 `json:"lon"`
|
||||||
|
Isp string `json:"isp"`
|
||||||
|
Org string `json:"org"`
|
||||||
|
As string `json:"as"`
|
||||||
|
Ip string `json:"query"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
publicIpInfo, err := netutil.GetPublicIpInfo()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(publicIpInfo)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <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/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>
|
||||||
|
|
||||||
|
<p>判断ip是否是公共ip</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsPublicIP(IP net.IP) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ip1 := net.ParseIP("192.168.0.1")
|
||||||
|
ip2 := net.ParseIP("36.112.24.10")
|
||||||
|
|
||||||
|
fmt.Println(netutil.IsPublicIP(ip1)) //false
|
||||||
|
fmt.Println(netutil.IsPublicIP(ip2)) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <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/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="HttpRequest">HttpRequest</span>
|
||||||
|
|
||||||
|
<p>HttpRequest用于抽象HTTP请求实体的结构</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type HttpRequest struct {
|
||||||
|
RawURL string
|
||||||
|
Method string
|
||||||
|
Headers http.Header
|
||||||
|
QueryParams url.Values
|
||||||
|
FormData url.Values
|
||||||
|
Body []byte
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
header := http.Header{}
|
||||||
|
header.Add("Content-Type", "multipart/form-data")
|
||||||
|
|
||||||
|
postData := url.Values{}
|
||||||
|
postData.Add("userId", "1")
|
||||||
|
postData.Add("title", "testItem")
|
||||||
|
|
||||||
|
request := &netutil.HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos",
|
||||||
|
Method: "POST",
|
||||||
|
Headers: header,
|
||||||
|
FormData: postData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpClient">HttpClient</span>
|
||||||
|
|
||||||
|
<p>HttpClient是用于发送HTTP请求的结构体。它可以用一些配置参数或无配置实例化.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type HttpClient struct {
|
||||||
|
*http.Client
|
||||||
|
TLS *tls.Config
|
||||||
|
Request *http.Request
|
||||||
|
Config HttpClientConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type HttpClientConfig struct {
|
||||||
|
SSLEnabled bool
|
||||||
|
TLSConfig *tls.Config
|
||||||
|
Compressed bool
|
||||||
|
HandshakeTimeout time.Duration
|
||||||
|
ResponseTimeout time.Duration
|
||||||
|
Verbose bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHttpClient() *HttpClient
|
||||||
|
|
||||||
|
func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
httpClientCfg := netutil.HttpClientConfig{
|
||||||
|
SSLEnabled: true,
|
||||||
|
HandshakeTimeout:10 * time.Second
|
||||||
|
}
|
||||||
|
httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SendRequest">SendRequest</span>
|
||||||
|
|
||||||
|
<p>HttpClient发送http请求</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
request := &netutil.HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos/1",
|
||||||
|
Method: "GET",
|
||||||
|
}
|
||||||
|
|
||||||
|
httpClient := netutil.NewHttpClient()
|
||||||
|
resp, err := httpClient.SendRequest(request)
|
||||||
|
if err != nil || resp.StatusCode != 200 {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Todo struct {
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Id int `json:"id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Completed bool `json:"completed"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var todo Todo
|
||||||
|
httpClient.DecodeResponse(resp, &todo)
|
||||||
|
|
||||||
|
fmt.Println(todo.Id) //1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="DecodeResponse">DecodeResponse</span>
|
||||||
|
|
||||||
|
<p>解析http响应体到目标结构体</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (client *HttpClient) DecodeResponse(resp *http.Response, target interface{}) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
request := &netutil.HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos/1",
|
||||||
|
Method: "GET",
|
||||||
|
}
|
||||||
|
|
||||||
|
httpClient := netutil.NewHttpClient()
|
||||||
|
resp, err := httpClient.SendRequest(request)
|
||||||
|
if err != nil || resp.StatusCode != 200 {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Todo struct {
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Id int `json:"id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Completed bool `json:"completed"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var todo Todo
|
||||||
|
httpClient.DecodeResponse(resp, &todo)
|
||||||
|
|
||||||
|
fmt.Println(todo.Id) //1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="StructToUrlValues">StructToUrlValues</span>
|
||||||
|
|
||||||
|
<p>将结构体转为url values, 仅转化结构体导出字段并且包含`json` tag.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func StructToUrlValues(targetStruct interface{}) url.Values
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type TodoQuery struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
}
|
||||||
|
todoQuery := TodoQuery{
|
||||||
|
Id: 1,
|
||||||
|
UserId: 2,
|
||||||
|
}
|
||||||
|
todoValues := netutil.StructToUrlValues(todoQuery)
|
||||||
|
|
||||||
|
fmt.Println(todoValues.Get("id")) //1
|
||||||
|
fmt.Println(todoValues.Get("userId")) //2
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpGet">HttpGet (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>发送http get请求</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]interface{}
|
||||||
|
// params[2] post请求体,类型必须是[]byte
|
||||||
|
// params[3] http client,类型必须是http.Client
|
||||||
|
func HttpGet(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := netutil.HttpGet(url, header)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpPost">HttpPost (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>发送http post请求</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]interface{}
|
||||||
|
// params[2] post请求体,类型必须是[]byte
|
||||||
|
// params[3] http client,类型必须是http.Client
|
||||||
|
func HttpPost(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
type Todo struct {
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
todo := Todo{1, "TestAddToDo"}
|
||||||
|
bodyParams, _ := json.Marshal(todo)
|
||||||
|
|
||||||
|
resp, err := netutil.HttpPost(url, header, nil, bodyParams)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpPut">HttpPut (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>发送http put请求</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]interface{}
|
||||||
|
// params[2] post请求体,类型必须是[]byte
|
||||||
|
// params[3] http client,类型必须是http.Client
|
||||||
|
func HttpPut(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
type Todo struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
todo := Todo{1, 1, "TestPutToDo"}
|
||||||
|
bodyParams, _ := json.Marshal(todo)
|
||||||
|
|
||||||
|
resp, err := netutil.HttpPut(url, header, nil, bodyParams)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpDelete">HttpDelete (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>发送http delete请求</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]interface{}
|
||||||
|
// params[2] post请求体,类型必须是[]byte
|
||||||
|
// params[3] http client,类型必须是http.Client
|
||||||
|
func HttpDelete(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
resp, err := netutil.HttpDelete(url)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="HttpPatch">HttpPatch (Deprecated: use SendRequest for replacement)</span>
|
||||||
|
|
||||||
|
<p>发送http patch请求</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
// params[0] http请求header,类型必须是http.Header或者map[string]string
|
||||||
|
// params[1] http查询字符串,类型必须是url.Values或者map[string]interface{}
|
||||||
|
// params[2] post请求体,类型必须是[]byte
|
||||||
|
// params[3] http client,类型必须是http.Client
|
||||||
|
func HttpPatch(url string, params ...interface{}) (*http.Response, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
type Todo struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
todo := Todo{1, 1, "TestPatchToDo"}
|
||||||
|
bodyParams, _ := json.Marshal(todo)
|
||||||
|
|
||||||
|
resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ParseHttpResponse">ParseHttpResponse</span>
|
||||||
|
|
||||||
|
<p>将http请求响应解码成特定struct值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ParseHttpResponse(resp *http.Response, obj interface{}) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/netutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
|
header := map[string]string{
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := netutil.HttpGet(url, header)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Todo struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Completed bool `json:"completed"`
|
||||||
|
}
|
||||||
|
|
||||||
|
toDoResp := &Todo{}
|
||||||
|
err = netutil.ParseHttpResponse(resp, toDoResp)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(toDoResp)
|
||||||
|
}
|
||||||
|
```
|
||||||
247
docs/random.md
Normal file
247
docs/random.md
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
# Random
|
||||||
|
|
||||||
|
Package random implements some basic functions to generate random int and string.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/random/random.go](https://github.com/duke-git/lancet/blob/v1/random/random.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [RandBytes](#RandBytes)
|
||||||
|
- [RandInt](#RandInt)
|
||||||
|
- [RandString](#RandString)
|
||||||
|
- [RandUpper](#RandUpper)
|
||||||
|
- [RandLower](#RandLower)
|
||||||
|
- [RandNumeral](#RandNumeral)
|
||||||
|
- [RandNumeralOrLetter](#RandNumeralOrLetter)
|
||||||
|
- [UUIdV4](#UUIdV4)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="RandBytes">RandBytes</span>
|
||||||
|
|
||||||
|
<p>Generate random byte slice.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandBytes(length int) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randBytes := random.RandBytes(4)
|
||||||
|
fmt.Println(randBytes)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandInt">RandInt</span>
|
||||||
|
|
||||||
|
<p>Generate random int between min and max, may contain min, not max.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandInt(min, max int) int
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
rInt := random.RandInt(1, 10)
|
||||||
|
fmt.Println(rInt)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandString">RandString</span>
|
||||||
|
|
||||||
|
<p>Generate random given length string. only contains letter (a-zA-Z)</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandString(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandString(6)
|
||||||
|
fmt.Println(randStr) //pGWsze
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandUpper">RandUpper</span>
|
||||||
|
|
||||||
|
<p>Generate a random upper case string</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandUpper(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandString(6)
|
||||||
|
fmt.Println(randStr) //PACWGF
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandLower">RandLower</span>
|
||||||
|
|
||||||
|
<p>Generate a random lower case string</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandLower(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandLower(6)
|
||||||
|
fmt.Println(randStr) //siqbew
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandNumeral">RandNumeral</span>
|
||||||
|
|
||||||
|
<p>Generate a random numeral string</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandNumeral(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandNumeral(6)
|
||||||
|
fmt.Println(randStr) //035172
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandNumeralOrLetter">RandNumeralOrLetter</span>
|
||||||
|
|
||||||
|
<p>generate a random numeral or letter string</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandNumeralOrLetter(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandNumeralOrLetter(6)
|
||||||
|
fmt.Println(randStr) //0aW7cQ
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UUIdV4">UUIdV4</span>
|
||||||
|
|
||||||
|
<p>Generate a random UUID of version 4 according to RFC 4122.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func UUIdV4() (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
uuid, err := random.UUIdV4()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(uuid)
|
||||||
|
}
|
||||||
|
```
|
||||||
247
docs/random_zh-CN.md
Normal file
247
docs/random_zh-CN.md
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
# Random
|
||||||
|
|
||||||
|
random 随机数生成器包,可以生成随机[]bytes, int, string。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/random/random.go](https://github.com/duke-git/lancet/blob/v1/random/random.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [RandBytes](#RandBytes)
|
||||||
|
- [RandInt](#RandInt)
|
||||||
|
- [RandString](#RandString)
|
||||||
|
- [RandUpper](#RandUpper)
|
||||||
|
- [RandLower](#RandLower)
|
||||||
|
- [RandNumeral](#RandNumeral)
|
||||||
|
- [RandNumeralOrLetter](#RandNumeralOrLetter)
|
||||||
|
- [UUIdV4](#UUIdV4)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
### <span id="RandBytes">RandBytes</span>
|
||||||
|
|
||||||
|
<p>生成随机字节切片</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandBytes(length int) []byte
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randBytes := random.RandBytes(4)
|
||||||
|
fmt.Println(randBytes)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandInt">RandInt</span>
|
||||||
|
|
||||||
|
<p>生成随机int, 范围[min, max)</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandInt(min, max int) int
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
rInt := random.RandInt(1, 10)
|
||||||
|
fmt.Println(rInt)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandString">RandString</span>
|
||||||
|
|
||||||
|
<p>生成给定长度的随机字符串,只包含字母(a-zA-Z)</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandString(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandString(6)
|
||||||
|
fmt.Println(randStr) //pGWsze
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandUpper">RandUpper</span>
|
||||||
|
|
||||||
|
<p>生成给定长度的随机大写字母字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandUpper(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandString(6)
|
||||||
|
fmt.Println(randStr) //PACWGF
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandLower">RandLower</span>
|
||||||
|
|
||||||
|
<p>生成给定长度的随机小写字母字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandLower(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandLower(6)
|
||||||
|
fmt.Println(randStr) //siqbew
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandNumeral">RandNumeral</span>
|
||||||
|
|
||||||
|
<p>生成给定长度的随机数字字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandNumeral(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandNumeral(6)
|
||||||
|
fmt.Println(randStr) //035172
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RandNumeralOrLetter">RandNumeralOrLetter</span>
|
||||||
|
|
||||||
|
<p>生成给定长度的随机字符串(数字+字母)</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandNumeralOrLetter(length int) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
randStr := random.RandNumeralOrLetter(6)
|
||||||
|
fmt.Println(randStr) //0aW7cQ
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UUIdV4">UUIdV4</span>
|
||||||
|
|
||||||
|
<p>生成UUID v4字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func UUIdV4() (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
uuid, err := random.UUIdV4()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(uuid)
|
||||||
|
}
|
||||||
|
```
|
||||||
239
docs/retry.md
Normal file
239
docs/retry.md
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
# Retry
|
||||||
|
|
||||||
|
Package retry is for executing a function repeatedly until it was successful or canceled by the context.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/retry/retry.go](https://github.com/duke-git/lancet/blob/v1/retry/retry.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [Context](#Context)
|
||||||
|
- [Retry](#Retry)
|
||||||
|
- [RetryFunc](#RetryFunc)
|
||||||
|
- [RetryDuration](#RetryDuration)
|
||||||
|
- [RetryTimes](#RetryTimes)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="Context">Context</span>
|
||||||
|
|
||||||
|
<p>Set retry context config, can cancel the retry with context.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Context(ctx context.Context)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ctx, cancel := context.WithCancel(context.TODO())
|
||||||
|
var number int
|
||||||
|
increaseNumber := func() error {
|
||||||
|
number++
|
||||||
|
if number > 3 {
|
||||||
|
cancel()
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber,
|
||||||
|
retry.RetryDuration(time.Microsecond*50),
|
||||||
|
retry.Context(ctx),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err) //retry is cancelled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RetryFunc">RetryFunc</span>
|
||||||
|
|
||||||
|
<p>Function that retry executes.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type RetryFunc func() error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var number int
|
||||||
|
var increaseNumber retry.RetryFunc
|
||||||
|
increaseNumber = func() error {
|
||||||
|
number++
|
||||||
|
if number == 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(number) //3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RetryTimes">RetryTimes</span>
|
||||||
|
|
||||||
|
<p>Set times of retry. Default times is 5.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RetryTimes(n uint)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var number int
|
||||||
|
increaseNumber := func() error {
|
||||||
|
number++
|
||||||
|
if number == 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber, retry.RetryTimes(2))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err) //2022/02/01 18:42:25 function main.main.func1 run failed after 2 times retry exit status 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RetryDuration">RetryDuration</span>
|
||||||
|
|
||||||
|
<p>Set duration of retries. Default duration is 3 second.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RetryDuration(d time.Duration)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var number int
|
||||||
|
increaseNumber := func() error {
|
||||||
|
number++
|
||||||
|
if number == 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(number) //3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Retry">Retry</span>
|
||||||
|
|
||||||
|
<p>Executes the retryFunc repeatedly until it was successful or canceled by the context.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Retry(retryFunc RetryFunc, opts ...Option) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var number int
|
||||||
|
increaseNumber := func() error {
|
||||||
|
number++
|
||||||
|
if number == 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(number) //3
|
||||||
|
}
|
||||||
|
```
|
||||||
239
docs/retry_zh-CN.md
Normal file
239
docs/retry_zh-CN.md
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
# Retry
|
||||||
|
|
||||||
|
retry 重试执行函数直到函数运行成功或被 context cancel。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/retry/retry.go](https://github.com/duke-git/lancet/blob/v1/retry/retry.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [Context](#Context)
|
||||||
|
- [Retry](#Retry)
|
||||||
|
- [RetryFunc](#RetryFunc)
|
||||||
|
- [RetryDuration](#RetryDuration)
|
||||||
|
- [RetryTimes](#RetryTimes)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Document 文档
|
||||||
|
|
||||||
|
### <span id="Context">Context</span>
|
||||||
|
|
||||||
|
<p>设置重试context参数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Context(ctx context.Context)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"lancet-demo/retry"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ctx, cancel := context.WithCancel(context.TODO())
|
||||||
|
var number int
|
||||||
|
increaseNumber := func() error {
|
||||||
|
number++
|
||||||
|
if number > 3 {
|
||||||
|
cancel()
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber,
|
||||||
|
retry.RetryDuration(time.Microsecond*50),
|
||||||
|
retry.Context(ctx),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err) //retry is cancelled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RetryFunc">RetryFunc</span>
|
||||||
|
|
||||||
|
<p>被重试执行的函数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
type RetryFunc func() error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var number int
|
||||||
|
var increaseNumber retry.RetryFunc
|
||||||
|
increaseNumber = func() error {
|
||||||
|
number++
|
||||||
|
if number == 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(number) //3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RetryTimes">RetryTimes</span>
|
||||||
|
|
||||||
|
<p>设置重试次数,默认5</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RetryTimes(n uint)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var number int
|
||||||
|
increaseNumber := func() error {
|
||||||
|
number++
|
||||||
|
if number == 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber, retry.RetryTimes(2))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err) //2022/02/01 18:42:25 function main.main.func1 run failed after 2 times retry exit status 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RetryDuration">RetryDuration</span>
|
||||||
|
|
||||||
|
<p>设置重试间隔时间,默认3秒</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RetryDuration(d time.Duration)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var number int
|
||||||
|
increaseNumber := func() error {
|
||||||
|
number++
|
||||||
|
if number == 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(number) //3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Retry">Retry</span>
|
||||||
|
|
||||||
|
<p>重试执行函数retryFunc,直到函数运行成功,或被context停止</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Retry(retryFunc RetryFunc, opts ...Option) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"github.com/duke-git/lancet/retry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var number int
|
||||||
|
increaseNumber := func() error {
|
||||||
|
number++
|
||||||
|
if number == 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("error occurs")
|
||||||
|
}
|
||||||
|
|
||||||
|
err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(number) //3
|
||||||
|
}
|
||||||
|
```
|
||||||
1174
docs/slice.md
Normal file
1174
docs/slice.md
Normal file
File diff suppressed because it is too large
Load Diff
1170
docs/slice_zh-CN.md
Normal file
1170
docs/slice_zh-CN.md
Normal file
File diff suppressed because it is too large
Load Diff
825
docs/strutil.md
Normal file
825
docs/strutil.md
Normal file
@@ -0,0 +1,825 @@
|
|||||||
|
# Strutil
|
||||||
|
|
||||||
|
Package strutil contains some functions to manipulate string.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/strutil/string.go](https://github.com/duke-git/lancet/blob/v1/strutil/string.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [After](#After)
|
||||||
|
- [AfterLast](#AfterLast)
|
||||||
|
- [Before](#Before)
|
||||||
|
- [BeforeLast](#BeforeLast)
|
||||||
|
- [CamelCase](#CamelCase)
|
||||||
|
- [Capitalize](#Capitalize)
|
||||||
|
- [IsString](#IsString)
|
||||||
|
- [KebabCase](#KebabCase)
|
||||||
|
- [UpperKebabCase](#UpperKebabCase)
|
||||||
|
- [LowerFirst](#LowerFirst)
|
||||||
|
- [UpperFirst](#UpperFirst)
|
||||||
|
- [Pad](#Pad)
|
||||||
|
- [PadEnd](#PadEnd)
|
||||||
|
- [PadStart](#PadStart)
|
||||||
|
- [Reverse](#Reverse)
|
||||||
|
- [SnakeCase](#SnakeCase)
|
||||||
|
- [UpperSnakeCase](#UpperSnakeCase)
|
||||||
|
- [Wrap](#Wrap)
|
||||||
|
- [Unwrap](#Unwrap)
|
||||||
|
- [SplitEx](#SplitEx)
|
||||||
|
- [SplitWords](#SplitWords)
|
||||||
|
- [WordCount](#WordCount)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="After">After</span>
|
||||||
|
|
||||||
|
<p>Creates substring in source string after position when char first appear.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func After(s, char string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.After("lancet", "")
|
||||||
|
fmt.Println(s1) //lancet
|
||||||
|
|
||||||
|
s2 := strutil.After("github.com/test/lancet", "/")
|
||||||
|
fmt.Println(s2) //test/lancet
|
||||||
|
|
||||||
|
s3 := strutil.After("github.com/test/lancet", "test")
|
||||||
|
fmt.Println(s3) // /lancet
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AfterLast">AfterLast</span>
|
||||||
|
|
||||||
|
<p>Creates substring in source string after position when char last appear.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AfterLast(s, char string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.AfterLast("lancet", "")
|
||||||
|
fmt.Println(s1) //lancet
|
||||||
|
|
||||||
|
s2 := strutil.AfterLast("github.com/test/lancet", "/")
|
||||||
|
fmt.Println(s2) //lancet
|
||||||
|
|
||||||
|
s3 := strutil.AfterLast("github.com/test/test/lancet", "test")
|
||||||
|
fmt.Println(s3) // /test/lancet
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Before">Before</span>
|
||||||
|
|
||||||
|
<p>Creates substring in source string before position when char first appear.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Before(s, char string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.Before("lancet", "")
|
||||||
|
fmt.Println(s1) //lancet
|
||||||
|
|
||||||
|
s2 := strutil.Before("github.com/test/lancet", "/")
|
||||||
|
fmt.Println(s2) //github.com
|
||||||
|
|
||||||
|
s3 := strutil.Before("github.com/test/lancet", "test")
|
||||||
|
fmt.Println(s3) // github.com/
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeforeLast">BeforeLast</span>
|
||||||
|
|
||||||
|
<p>Creates substring in source string before position when char first appear.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeforeLast(s, char string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.BeforeLast("lancet", "")
|
||||||
|
fmt.Println(s1) //lancet
|
||||||
|
|
||||||
|
s2 := strutil.BeforeLast("github.com/test/lancet", "/")
|
||||||
|
fmt.Println(s2) //github.com/test
|
||||||
|
|
||||||
|
s3 := strutil.BeforeLast("github.com/test/test/lancet", "test")
|
||||||
|
fmt.Println(s3) //github.com/test/
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CamelCase">CamelCase</span>
|
||||||
|
|
||||||
|
<p>Coverts string to camelCase string, non letters and numbers will be ignored.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CamelCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.CamelCase("foo_bar")
|
||||||
|
fmt.Println(s1) //fooBar
|
||||||
|
|
||||||
|
s2 := strutil.CamelCase("Foo-Bar")
|
||||||
|
fmt.Println(s2) //fooBar
|
||||||
|
|
||||||
|
s3 := strutil.CamelCase("Foo&bar")
|
||||||
|
fmt.Println(s3) //fooBar
|
||||||
|
|
||||||
|
s4 := strutil.CamelCase("foo bar")
|
||||||
|
fmt.Println(s4) //fooBar
|
||||||
|
|
||||||
|
s4 := strutil.CamelCase("Foo-#1😄$_%^&*(1bar")
|
||||||
|
fmt.Println(s4) //foo11Bar
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Capitalize">Capitalize</span>
|
||||||
|
|
||||||
|
<p>Convert the first character of a string to upper case.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Capitalize(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.Capitalize("foo")
|
||||||
|
fmt.Println(s1) //foo
|
||||||
|
|
||||||
|
s2 := strutil.Capitalize("Foo")
|
||||||
|
fmt.Println(s2) //foo
|
||||||
|
|
||||||
|
s3 := strutil.Capitalize("FOo"
|
||||||
|
fmt.Println(s3) //fOo
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsString">IsString</span>
|
||||||
|
|
||||||
|
<p>Check if the value's data type is string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsString(v interface{}) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(strutil.IsString("lancet")) //true
|
||||||
|
fmt.Println(strutil.IsString("")) //true
|
||||||
|
|
||||||
|
fmt.Println(strutil.IsString(1)) //false
|
||||||
|
fmt.Println(strutil.IsString("")) //false
|
||||||
|
fmt.Println(strutil.IsString([]string{})) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="KebabCase">KebabCase</span>
|
||||||
|
|
||||||
|
<p>KebabCase covert string to kebab-case, non letters and numbers will be ignored.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func KebabCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.KebabCase("Foo Bar-")
|
||||||
|
fmt.Println(s1) //foo-bar
|
||||||
|
|
||||||
|
s2 := strutil.KebabCase("foo_Bar")
|
||||||
|
fmt.Println(s2) //foo-bar
|
||||||
|
|
||||||
|
s3 := strutil.KebabCase("fooBar")
|
||||||
|
fmt.Println(s3) //foo-bar
|
||||||
|
|
||||||
|
s4 := strutil.KebabCase("__FOO_BAR__")
|
||||||
|
fmt.Println(s4) //foo-bar
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UpperKebabCase">UpperKebabCase</span>
|
||||||
|
|
||||||
|
<p>UpperKebabCase covert string to upper KEBAB-CASE, non letters and numbers will be ignored.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func KebabCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.UpperKebabCase("Foo Bar-")
|
||||||
|
fmt.Println(s1) //FOO-BAR
|
||||||
|
|
||||||
|
s2 := strutil.UpperKebabCase("foo_Bar")
|
||||||
|
fmt.Println(s2) //FOO-BAR
|
||||||
|
|
||||||
|
s3 := strutil.UpperKebabCase("fooBar")
|
||||||
|
fmt.Println(s3) //FOO-BAR
|
||||||
|
|
||||||
|
s4 := strutil.UpperKebabCase("__FOO_BAR__")
|
||||||
|
fmt.Println(s4) //FOO-BAR
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="LowerFirst">LowerFirst</span>
|
||||||
|
|
||||||
|
<p>Convert the first character of string to lower case.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func LowerFirst(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.LowerFirst("foo")
|
||||||
|
fmt.Println(s1) //foo
|
||||||
|
|
||||||
|
s2 := strutil.LowerFirst("BAR")
|
||||||
|
fmt.Println(s2) //bAR
|
||||||
|
|
||||||
|
s3 := strutil.LowerFirst("FOo")
|
||||||
|
fmt.Println(s3) //fOo
|
||||||
|
|
||||||
|
s4 := strutil.LowerFirst("fOo大")
|
||||||
|
fmt.Println(s4) //fOo大
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UpperFirst">UpperFirst</span>
|
||||||
|
|
||||||
|
<p>Convert the first character of string to upper case.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func UpperFirst(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.UpperFirst("foo")
|
||||||
|
fmt.Println(s1) //Foo
|
||||||
|
|
||||||
|
s2 := strutil.UpperFirst("bAR")
|
||||||
|
fmt.Println(s2) //BAR
|
||||||
|
|
||||||
|
s3 := strutil.UpperFirst("FOo")
|
||||||
|
fmt.Println(s3) //FOo
|
||||||
|
|
||||||
|
s4 := strutil.UpperFirst("fOo大")
|
||||||
|
fmt.Println(s4) //FOo大
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Pad">Pad</span>
|
||||||
|
|
||||||
|
<p>Pads string on the left and right side if it's shorter than size.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Pad(source string, size int, padStr string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.Pad("foo", 1, "bar")
|
||||||
|
result2 := strutil.Pad("foo", 2, "bar")
|
||||||
|
result3 := strutil.Pad("foo", 3, "bar")
|
||||||
|
result4 := strutil.Pad("foo", 4, "bar")
|
||||||
|
result5 := strutil.Pad("foo", 5, "bar")
|
||||||
|
result6 := strutil.Pad("foo", 6, "bar")
|
||||||
|
result7 := strutil.Pad("foo", 7, "bar")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
fmt.Println(result7)
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foob
|
||||||
|
// bfoob
|
||||||
|
// bfooba
|
||||||
|
// bafooba
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="PadEnd">PadEnd</span>
|
||||||
|
|
||||||
|
<p>Pads string on the right side if it's shorter than size.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func PadEnd(source string, size int, padStr string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.PadEnd("foo", 1, "bar")
|
||||||
|
result2 := strutil.PadEnd("foo", 2, "bar")
|
||||||
|
result3 := strutil.PadEnd("foo", 3, "bar")
|
||||||
|
result4 := strutil.PadEnd("foo", 4, "bar")
|
||||||
|
result5 := strutil.PadEnd("foo", 5, "bar")
|
||||||
|
result6 := strutil.PadEnd("foo", 6, "bar")
|
||||||
|
result7 := strutil.PadEnd("foo", 7, "bar")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
fmt.Println(result7)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foob
|
||||||
|
// fooba
|
||||||
|
// foobar
|
||||||
|
// foobarb
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="PadStart">PadStart</span>
|
||||||
|
|
||||||
|
<p>Pads string on the left side if it's shorter than size.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func PadStart(source string, size int, padStr string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.PadStart("foo", 1, "bar")
|
||||||
|
result2 := strutil.PadStart("foo", 2, "bar")
|
||||||
|
result3 := strutil.PadStart("foo", 3, "bar")
|
||||||
|
result4 := strutil.PadStart("foo", 4, "bar")
|
||||||
|
result5 := strutil.PadStart("foo", 5, "bar")
|
||||||
|
result6 := strutil.PadStart("foo", 6, "bar")
|
||||||
|
result7 := strutil.PadStart("foo", 7, "bar")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
fmt.Println(result7)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// bfoo
|
||||||
|
// bafoo
|
||||||
|
// barfoo
|
||||||
|
// barbfoo
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ReverseStr">ReverseStr</span>
|
||||||
|
|
||||||
|
<p>Return string whose char order is reversed to the given string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ReverseStr(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.ReverseStr("abc")
|
||||||
|
fmt.Println(s1) //cba
|
||||||
|
|
||||||
|
s2 := strutil.ReverseStr("12345")
|
||||||
|
fmt.Println(s2) //54321
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SnakeCase">SnakeCase</span>
|
||||||
|
|
||||||
|
<p>Coverts string to snake_case, non letters and numbers will be ignored.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SnakeCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.SnakeCase("Foo Bar-")
|
||||||
|
fmt.Println(s1) //foo_bar
|
||||||
|
|
||||||
|
s2 := strutil.SnakeCase("foo_Bar")
|
||||||
|
fmt.Println(s2) //foo_bar
|
||||||
|
|
||||||
|
s3 := strutil.SnakeCase("fooBar")
|
||||||
|
fmt.Println(s3) //foo_bar
|
||||||
|
|
||||||
|
s4 := strutil.SnakeCase("__FOO_BAR__")
|
||||||
|
fmt.Println(s4) //foo_bar
|
||||||
|
|
||||||
|
s5 := strutil.SnakeCase("Foo-#1😄$_%^&*(1bar")
|
||||||
|
fmt.Println(s5) //foo_1_1_bar
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UpperSnakeCase">UpperSnakeCase</span>
|
||||||
|
|
||||||
|
<p>Coverts string to upper KEBAB-CASE, non letters and numbers will be ignored.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SnakeCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.UpperSnakeCase("Foo Bar-")
|
||||||
|
fmt.Println(s1) //FOO_BAR
|
||||||
|
|
||||||
|
s2 := strutil.UpperSnakeCase("foo_Bar")
|
||||||
|
fmt.Println(s2) //FOO_BAR
|
||||||
|
|
||||||
|
s3 := strutil.UpperSnakeCase("fooBar")
|
||||||
|
fmt.Println(s3) //FOO_BAR
|
||||||
|
|
||||||
|
s4 := strutil.UpperSnakeCase("__FOO_BAR__")
|
||||||
|
fmt.Println(s4) //FOO_BAR
|
||||||
|
|
||||||
|
s5 := strutil.UpperSnakeCase("Foo-#1😄$_%^&*(1bar")
|
||||||
|
fmt.Println(s5) //FOO_1_1_BAR
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Wrap">Wrap</span>
|
||||||
|
|
||||||
|
<p>Wrap a string with another string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Wrap(str string, wrapWith string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.Wrap("ab", "")
|
||||||
|
fmt.Println(s1) //ab
|
||||||
|
|
||||||
|
s2 := strutil.Wrap("", "*")
|
||||||
|
fmt.Println(s2) //""
|
||||||
|
|
||||||
|
s3 := strutil.Wrap("ab", "*")
|
||||||
|
fmt.Println(s3) //*ab*
|
||||||
|
|
||||||
|
s4 := strutil.Wrap("ab", "\"")
|
||||||
|
fmt.Println(s4) //\"ab\"
|
||||||
|
|
||||||
|
s5 := strutil.Wrap("ab", "'")
|
||||||
|
fmt.Println(s5) //'ab'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Wrap">Wrap</span>
|
||||||
|
|
||||||
|
<p>Unwrap a given string from anther string. will change str value.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Unwrap(str string, wrapToken string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.Unwrap("ab", "")
|
||||||
|
fmt.Println(s1) //ab
|
||||||
|
|
||||||
|
s2 := strutil.Unwrap("ab", "*")
|
||||||
|
fmt.Println(s2) //ab
|
||||||
|
|
||||||
|
s3 := strutil.Unwrap("**ab**", "*")
|
||||||
|
fmt.Println(s3) //*ab*
|
||||||
|
|
||||||
|
s4 := strutil.Unwrap("*ab", "*")
|
||||||
|
fmt.Println(s4) //*ab
|
||||||
|
|
||||||
|
s5 := strutil.Unwrap("***", "**")
|
||||||
|
fmt.Println(s5) //***
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SplitEx">SplitEx</span>
|
||||||
|
|
||||||
|
<p>Split a given string whether the result contains empty string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SplitEx(s, sep string, removeEmptyString bool) []string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
arr1 := strutil.SplitEx(" a b c ", "", true)
|
||||||
|
fmt.Println(arr1) //[]string{}
|
||||||
|
|
||||||
|
arr2 := strutil.SplitEx(" a b c ", " ", false)
|
||||||
|
fmt.Println(arr2) //[]string{"", "a", "b", "c", ""}
|
||||||
|
|
||||||
|
arr3 := strutil.SplitEx(" a b c ", " ", true)
|
||||||
|
fmt.Println(arr3) //[]string{"a", "b", "c"}
|
||||||
|
|
||||||
|
arr4 := strutil.SplitEx(" a = b = c = ", " = ", false)
|
||||||
|
fmt.Println(arr4) //[]string{" a", "b", "c", ""}
|
||||||
|
|
||||||
|
arr5 := strutil.SplitEx(" a = b = c = ", " = ", true)
|
||||||
|
fmt.Println(arr5) //[]string{" a", "b", "c"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SplitWords">SplitWords</span>
|
||||||
|
|
||||||
|
<p>Splits a string into words, word only contains alphabetic characters.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SplitWords(s string) []string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.SplitWords("a word")
|
||||||
|
result2 := strutil.SplitWords("I'am a programmer")
|
||||||
|
result3 := strutil.SplitWords("Bonjour, je suis programmeur")
|
||||||
|
result4 := strutil.SplitWords("a -b-c' 'd'e")
|
||||||
|
result5 := strutil.SplitWords("你好,我是一名码农")
|
||||||
|
result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [a word]
|
||||||
|
// [I'am a programmer]
|
||||||
|
// [Bonjour je suis programmeur]
|
||||||
|
// [a b-c' d'e]
|
||||||
|
// []
|
||||||
|
// []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="WordCount">WordCount</span>
|
||||||
|
|
||||||
|
<p>Return the number of meaningful word, word only contains alphabetic characters.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func WordCount(s string) int
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.WordCount("a word")
|
||||||
|
result2 := strutil.WordCount("I'am a programmer")
|
||||||
|
result3 := strutil.WordCount("Bonjour, je suis programmeur")
|
||||||
|
result4 := strutil.WordCount("a -b-c' 'd'e")
|
||||||
|
result5 := strutil.WordCount("你好,我是一名码农")
|
||||||
|
result6 := strutil.WordCount("こんにちは,私はプログラマーです")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 2
|
||||||
|
// 3
|
||||||
|
// 4
|
||||||
|
// 3
|
||||||
|
// 0
|
||||||
|
// 0
|
||||||
|
}
|
||||||
|
```
|
||||||
826
docs/strutil_zh-CN.md
Normal file
826
docs/strutil_zh-CN.md
Normal file
@@ -0,0 +1,826 @@
|
|||||||
|
# Strutil
|
||||||
|
|
||||||
|
strutil 包含处理字符串的相关函数。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/strutil/string.go](https://github.com/duke-git/lancet/blob/v1/strutil/string.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [After](#After)
|
||||||
|
- [AfterLast](#AfterLast)
|
||||||
|
- [Before](#Before)
|
||||||
|
- [BeforeLast](#BeforeLast)
|
||||||
|
- [CamelCase](#CamelCase)
|
||||||
|
- [Capitalize](#Capitalize)
|
||||||
|
- [IsString](#IsString)
|
||||||
|
- [KebabCase](#KebabCase)
|
||||||
|
- [UpperKebabCase](#UpperKebabCase)
|
||||||
|
- [LowerFirst](#LowerFirst)
|
||||||
|
- [UpperFirst](#UpperFirst)
|
||||||
|
- [Pad](#Pad)
|
||||||
|
- [PadEnd](#PadEnd)
|
||||||
|
- [PadStart](#PadStart)
|
||||||
|
- [Reverse](#Reverse)
|
||||||
|
- [SnakeCase](#SnakeCase)
|
||||||
|
- [UpperSnakeCase](#UpperSnakeCase)
|
||||||
|
- [Wrap](#Wrap)
|
||||||
|
- [Unwrap](#Unwrap)
|
||||||
|
- [SplitEx](#SplitEx)
|
||||||
|
- [SplitWords](#SplitWords)
|
||||||
|
- [WordCount](#WordCount)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation 文档
|
||||||
|
|
||||||
|
### <span id="After">After</span>
|
||||||
|
|
||||||
|
<p>截取源字符串中char首次出现时的位置之后的子字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func After(s, char string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.After("lancet", "")
|
||||||
|
fmt.Println(s1) //lancet
|
||||||
|
|
||||||
|
s2 := strutil.After("github.com/test/lancet", "/")
|
||||||
|
fmt.Println(s2) //test/lancet
|
||||||
|
|
||||||
|
s3 := strutil.After("github.com/test/lancet", "test")
|
||||||
|
fmt.Println(s3) // /lancet
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="AfterLast">AfterLast</span>
|
||||||
|
|
||||||
|
<p>截取源字符串中char最后一次出现时的位置之后的子字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func AfterLast(s, char string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.AfterLast("lancet", "")
|
||||||
|
fmt.Println(s1) //lancet
|
||||||
|
|
||||||
|
s2 := strutil.AfterLast("github.com/test/lancet", "/")
|
||||||
|
fmt.Println(s2) //lancet
|
||||||
|
|
||||||
|
s3 := strutil.AfterLast("github.com/test/test/lancet", "test")
|
||||||
|
fmt.Println(s3) // /lancet
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Before">Before</span>
|
||||||
|
|
||||||
|
<p>截取源字符串中char首次出现时的位置之前的子字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Before(s, char string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.Before("lancet", "")
|
||||||
|
fmt.Println(s1) //lancet
|
||||||
|
|
||||||
|
s2 := strutil.Before("github.com/test/lancet", "/")
|
||||||
|
fmt.Println(s2) //github.com
|
||||||
|
|
||||||
|
s3 := strutil.Before("github.com/test/lancet", "test")
|
||||||
|
fmt.Println(s3) // github.com/
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="BeforeLast">BeforeLast</span>
|
||||||
|
|
||||||
|
<p>截取源字符串中char最后一次出现时的位置之前的子字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func BeforeLast(s, char string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.BeforeLast("lancet", "")
|
||||||
|
fmt.Println(s1) //lancet
|
||||||
|
|
||||||
|
s2 := strutil.BeforeLast("github.com/test/lancet", "/")
|
||||||
|
fmt.Println(s2) //github.com/test
|
||||||
|
|
||||||
|
s3 := strutil.BeforeLast("github.com/test/test/lancet", "test")
|
||||||
|
fmt.Println(s3) //github.com/test/
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CamelCase">CamelCase</span>
|
||||||
|
|
||||||
|
<p>将字符串转换为驼峰式字符串, 非字母和数字会被忽略</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CamelCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.CamelCase("foo_bar")
|
||||||
|
fmt.Println(s1) //fooBar
|
||||||
|
|
||||||
|
s2 := strutil.CamelCase("Foo-Bar")
|
||||||
|
fmt.Println(s2) //fooBar
|
||||||
|
|
||||||
|
s3 := strutil.CamelCase("Foo&bar")
|
||||||
|
fmt.Println(s3) //fooBar
|
||||||
|
|
||||||
|
s4 := strutil.CamelCase("foo bar")
|
||||||
|
fmt.Println(s4) //fooBar
|
||||||
|
|
||||||
|
s4 := strutil.CamelCase("Foo-#1😄$_%^&*(1bar")
|
||||||
|
fmt.Println(s4) //foo11Bar
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Capitalize">Capitalize</span>
|
||||||
|
|
||||||
|
<p>将字符串的第一个字符转换为大写</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Capitalize(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.Capitalize("foo")
|
||||||
|
fmt.Println(s1) //foo
|
||||||
|
|
||||||
|
s2 := strutil.Capitalize("Foo")
|
||||||
|
fmt.Println(s2) //foo
|
||||||
|
|
||||||
|
s3 := strutil.Capitalize("FOo"
|
||||||
|
fmt.Println(s3) //fOo
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsString">IsString</span>
|
||||||
|
|
||||||
|
<p>检查值的数据类型是否为字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsString(v interface{}) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(strutil.IsString("lancet")) //true
|
||||||
|
fmt.Println(strutil.IsString("")) //true
|
||||||
|
|
||||||
|
fmt.Println(strutil.IsString(1)) //false
|
||||||
|
fmt.Println(strutil.IsString("")) //false
|
||||||
|
fmt.Println(strutil.IsString([]string{})) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="KebabCase">KebabCase</span>
|
||||||
|
|
||||||
|
<p>将字符串转换为kebab-case, 非字母和数字会被忽略</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func KebabCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.KebabCase("Foo Bar-")
|
||||||
|
fmt.Println(s1) //foo-bar
|
||||||
|
|
||||||
|
s2 := strutil.KebabCase("foo_Bar")
|
||||||
|
fmt.Println(s2) //foo-bar
|
||||||
|
|
||||||
|
s3 := strutil.KebabCase("fooBar")
|
||||||
|
fmt.Println(s3) //foo-bar
|
||||||
|
|
||||||
|
s4 := strutil.KebabCase("__FOO_BAR__")
|
||||||
|
fmt.Println(s4) //foo-bar
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UpperKebabCase">UpperKebabCase</span>
|
||||||
|
|
||||||
|
<p>将字符串转换为大写KEBAB-CASE, 非字母和数字会被忽略</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func KebabCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.UpperKebabCase("Foo Bar-")
|
||||||
|
fmt.Println(s1) //FOO-BAR
|
||||||
|
|
||||||
|
s2 := strutil.UpperKebabCase("foo_Bar")
|
||||||
|
fmt.Println(s2) //FOO-BAR
|
||||||
|
|
||||||
|
s3 := strutil.UpperKebabCase("fooBar")
|
||||||
|
fmt.Println(s3) //FOO-BAR
|
||||||
|
|
||||||
|
s4 := strutil.UpperKebabCase("__FOO_BAR__")
|
||||||
|
fmt.Println(s4) //FOO-BAR
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="LowerFirst">LowerFirst</span>
|
||||||
|
|
||||||
|
<p>将字符串的第一个字符转换为小写</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func LowerFirst(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.LowerFirst("foo")
|
||||||
|
fmt.Println(s1) //foo
|
||||||
|
|
||||||
|
s2 := strutil.LowerFirst("BAR")
|
||||||
|
fmt.Println(s2) //bAR
|
||||||
|
|
||||||
|
s3 := strutil.LowerFirst("FOo")
|
||||||
|
fmt.Println(s3) //fOo
|
||||||
|
|
||||||
|
s4 := strutil.LowerFirst("fOo大")
|
||||||
|
fmt.Println(s4) //fOo大
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UpperFirst">UpperFirst</span>
|
||||||
|
|
||||||
|
<p>将字符串的第一个字符转换为大写</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func UpperFirst(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.UpperFirst("foo")
|
||||||
|
fmt.Println(s1) //Foo
|
||||||
|
|
||||||
|
s2 := strutil.UpperFirst("bAR")
|
||||||
|
fmt.Println(s2) //BAR
|
||||||
|
|
||||||
|
s3 := strutil.UpperFirst("FOo")
|
||||||
|
fmt.Println(s3) //FOo
|
||||||
|
|
||||||
|
s4 := strutil.UpperFirst("fOo大")
|
||||||
|
fmt.Println(s4) //FOo大
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Pad">Pad</span>
|
||||||
|
|
||||||
|
<p>如果字符串长度短于size,则在左右两侧填充字符串。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Pad(source string, size int, padStr string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.Pad("foo", 1, "bar")
|
||||||
|
result2 := strutil.Pad("foo", 2, "bar")
|
||||||
|
result3 := strutil.Pad("foo", 3, "bar")
|
||||||
|
result4 := strutil.Pad("foo", 4, "bar")
|
||||||
|
result5 := strutil.Pad("foo", 5, "bar")
|
||||||
|
result6 := strutil.Pad("foo", 6, "bar")
|
||||||
|
result7 := strutil.Pad("foo", 7, "bar")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
fmt.Println(result7)
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foob
|
||||||
|
// bfoob
|
||||||
|
// bfooba
|
||||||
|
// bafooba
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="PadEnd">PadEnd</span>
|
||||||
|
|
||||||
|
<p>如果字符串长度短于size,则在右侧填充字符串。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func PadEnd(source string, size int, padStr string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.PadEnd("foo", 1, "bar")
|
||||||
|
result2 := strutil.PadEnd("foo", 2, "bar")
|
||||||
|
result3 := strutil.PadEnd("foo", 3, "bar")
|
||||||
|
result4 := strutil.PadEnd("foo", 4, "bar")
|
||||||
|
result5 := strutil.PadEnd("foo", 5, "bar")
|
||||||
|
result6 := strutil.PadEnd("foo", 6, "bar")
|
||||||
|
result7 := strutil.PadEnd("foo", 7, "bar")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
fmt.Println(result7)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foob
|
||||||
|
// fooba
|
||||||
|
// foobar
|
||||||
|
// foobarb
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="PadStart">PadStart</span>
|
||||||
|
|
||||||
|
<p>如果字符串长度短于size,则在左侧填充字符串。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func PadStart(source string, size int, padStr string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.PadStart("foo", 1, "bar")
|
||||||
|
result2 := strutil.PadStart("foo", 2, "bar")
|
||||||
|
result3 := strutil.PadStart("foo", 3, "bar")
|
||||||
|
result4 := strutil.PadStart("foo", 4, "bar")
|
||||||
|
result5 := strutil.PadStart("foo", 5, "bar")
|
||||||
|
result6 := strutil.PadStart("foo", 6, "bar")
|
||||||
|
result7 := strutil.PadStart("foo", 7, "bar")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
fmt.Println(result7)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// foo
|
||||||
|
// bfoo
|
||||||
|
// bafoo
|
||||||
|
// barfoo
|
||||||
|
// barbfoo
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ReverseStr">ReverseStr</span>
|
||||||
|
|
||||||
|
<p>返回字符顺序与给定字符串相反的字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ReverseStr(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.ReverseStr("abc")
|
||||||
|
fmt.Println(s1) //cba
|
||||||
|
|
||||||
|
s2 := strutil.ReverseStr("12345")
|
||||||
|
fmt.Println(s2) //54321
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SnakeCase">SnakeCase</span>
|
||||||
|
|
||||||
|
<p>将字符串转换为snake_case形式, 非字母和数字会被忽略</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SnakeCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.SnakeCase("Foo Bar-")
|
||||||
|
fmt.Println(s1) //foo_bar
|
||||||
|
|
||||||
|
s2 := strutil.SnakeCase("foo_Bar")
|
||||||
|
fmt.Println(s2) //foo_bar
|
||||||
|
|
||||||
|
s3 := strutil.SnakeCase("fooBar")
|
||||||
|
fmt.Println(s3) //foo_bar
|
||||||
|
|
||||||
|
s4 := strutil.SnakeCase("__FOO_BAR__")
|
||||||
|
fmt.Println(s4) //foo_bar
|
||||||
|
|
||||||
|
s5 := strutil.SnakeCase("Foo-#1😄$_%^&*(1bar")
|
||||||
|
fmt.Println(s5) //foo_1_1_bar
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="UpperSnakeCase">UpperSnakeCase</span>
|
||||||
|
|
||||||
|
<p>将字符串转换为大写SNAKE_CASE形式, 非字母和数字会被忽略</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SnakeCase(s string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.UpperSnakeCase("Foo Bar-")
|
||||||
|
fmt.Println(s1) //FOO_BAR
|
||||||
|
|
||||||
|
s2 := strutil.UpperSnakeCase("foo_Bar")
|
||||||
|
fmt.Println(s2) //FOO_BAR
|
||||||
|
|
||||||
|
s3 := strutil.UpperSnakeCase("fooBar")
|
||||||
|
fmt.Println(s3) //FOO_BAR
|
||||||
|
|
||||||
|
s4 := strutil.UpperSnakeCase("__FOO_BAR__")
|
||||||
|
fmt.Println(s4) //FOO_BAR
|
||||||
|
|
||||||
|
s5 := strutil.UpperSnakeCase("Foo-#1😄$_%^&*(1bar")
|
||||||
|
fmt.Println(s5) //FOO_1_1_BAR
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Wrap">Wrap</span>
|
||||||
|
|
||||||
|
<p>用另一个字符串包裹一个字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Wrap(str string, wrapWith string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.Wrap("ab", "")
|
||||||
|
fmt.Println(s1) //ab
|
||||||
|
|
||||||
|
s2 := strutil.Wrap("", "*")
|
||||||
|
fmt.Println(s2) //""
|
||||||
|
|
||||||
|
s3 := strutil.Wrap("ab", "*")
|
||||||
|
fmt.Println(s3) //*ab*
|
||||||
|
|
||||||
|
s4 := strutil.Wrap("ab", "\"")
|
||||||
|
fmt.Println(s4) //\"ab\"
|
||||||
|
|
||||||
|
s5 := strutil.Wrap("ab", "'")
|
||||||
|
fmt.Println(s5) //'ab'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Unwrap">Unwrap</span>
|
||||||
|
|
||||||
|
<p>用另一个字符串解开包裹一个字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Unwrap(str string, wrapToken string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s1 := strutil.Unwrap("ab", "")
|
||||||
|
fmt.Println(s1) //ab
|
||||||
|
|
||||||
|
s2 := strutil.Unwrap("ab", "*")
|
||||||
|
fmt.Println(s2) //ab
|
||||||
|
|
||||||
|
s3 := strutil.Unwrap("**ab**", "*")
|
||||||
|
fmt.Println(s3) //*ab*
|
||||||
|
|
||||||
|
s4 := strutil.Unwrap("*ab", "*")
|
||||||
|
fmt.Println(s4) //*ab
|
||||||
|
|
||||||
|
s5 := strutil.Unwrap("***", "**")
|
||||||
|
fmt.Println(s5) //***
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SplitEx">SplitEx</span>
|
||||||
|
|
||||||
|
<p>分割字符串为切片,removeEmptyString参数指定是否去除空字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SplitEx(s, sep string, removeEmptyString bool) []string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
arr1 := strutil.SplitEx(" a b c ", "", true)
|
||||||
|
fmt.Println(arr1) //[]string{}
|
||||||
|
|
||||||
|
arr2 := strutil.SplitEx(" a b c ", " ", false)
|
||||||
|
fmt.Println(arr2) //[]string{"", "a", "b", "c", ""}
|
||||||
|
|
||||||
|
arr3 := strutil.SplitEx(" a b c ", " ", true)
|
||||||
|
fmt.Println(arr3) //[]string{"a", "b", "c"}
|
||||||
|
|
||||||
|
arr4 := strutil.SplitEx(" a = b = c = ", " = ", false)
|
||||||
|
fmt.Println(arr4) //[]string{" a", "b", "c", ""}
|
||||||
|
|
||||||
|
arr5 := strutil.SplitEx(" a = b = c = ", " = ", true)
|
||||||
|
fmt.Println(arr5) //[]string{" a", "b", "c"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SplitWords">SplitWords</span>
|
||||||
|
|
||||||
|
<p>将字符串拆分为单词,只支持字母字符单词。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SplitWords(s string) []string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.SplitWords("a word")
|
||||||
|
result2 := strutil.SplitWords("I'am a programmer")
|
||||||
|
result3 := strutil.SplitWords("Bonjour, je suis programmeur")
|
||||||
|
result4 := strutil.SplitWords("a -b-c' 'd'e")
|
||||||
|
result5 := strutil.SplitWords("你好,我是一名码农")
|
||||||
|
result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [a word]
|
||||||
|
// [I'am a programmer]
|
||||||
|
// [Bonjour je suis programmeur]
|
||||||
|
// [a b-c' d'e]
|
||||||
|
// []
|
||||||
|
// []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="WordCount">WordCount</span>
|
||||||
|
|
||||||
|
<p>返回有意义单词的数量,只支持字母字符单词。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func WordCount(s string) int
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/strutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := strutil.WordCount("a word")
|
||||||
|
result2 := strutil.WordCount("I'am a programmer")
|
||||||
|
result3 := strutil.WordCount("Bonjour, je suis programmeur")
|
||||||
|
result4 := strutil.WordCount("a -b-c' 'd'e")
|
||||||
|
result5 := strutil.WordCount("你好,我是一名码农")
|
||||||
|
result6 := strutil.WordCount("こんにちは,私はプログラマーです")
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
fmt.Println(result3)
|
||||||
|
fmt.Println(result4)
|
||||||
|
fmt.Println(result5)
|
||||||
|
fmt.Println(result6)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 2
|
||||||
|
// 3
|
||||||
|
// 4
|
||||||
|
// 3
|
||||||
|
// 0
|
||||||
|
// 0
|
||||||
|
}
|
||||||
|
```
|
||||||
258
docs/system.md
Normal file
258
docs/system.md
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
# System
|
||||||
|
|
||||||
|
Package system contains some functions about os, runtime, shell command.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/system/os.go](https://github.com/duke-git/lancet/blob/v1/system/os.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [IsWindows](#IsWindows)
|
||||||
|
- [IsLinux](#IsLinux)
|
||||||
|
- [IsMac](#IsMac)
|
||||||
|
- [GetOsEnv](#GetOsEnv)
|
||||||
|
- [SetOsEnv](#SetOsEnv)
|
||||||
|
- [RemoveOsEnv](#RemoveOsEnv)
|
||||||
|
- [CompareOsEnv](#CompareOsEnv)
|
||||||
|
- [ExecCommand](#ExecCommand)
|
||||||
|
- [GetOsBits](#GetOsBits)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="IsWindows">IsWindows</span>
|
||||||
|
|
||||||
|
<p>Check if current os is windows.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsWindows() bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isOsWindows := system.IsWindows()
|
||||||
|
fmt.Println(isOsWindows)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsLinux">IsLinux</span>
|
||||||
|
|
||||||
|
<p>Check if current os is linux.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsLinux() bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isOsLinux := system.IsLinux()
|
||||||
|
fmt.Println(isOsLinux)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsMac">IsMac</span>
|
||||||
|
|
||||||
|
<p>Check if current os is macos.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsMac() bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isOsMac := system.IsMac
|
||||||
|
fmt.Println(isOsMac)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetOsEnv">GetOsEnv</span>
|
||||||
|
|
||||||
|
<p>Gets the value of the environment variable named by the key.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetOsEnv(key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fooEnv := system.GetOsEnv("foo")
|
||||||
|
fmt.Println(fooEnv)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SetOsEnv">SetOsEnv</span>
|
||||||
|
|
||||||
|
<p>Sets the value of the environment variable named by the key.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SetOsEnv(key, value string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := system.SetOsEnv("foo", "foo_value")
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RemoveOsEnv">RemoveOsEnv</span>
|
||||||
|
|
||||||
|
<p>Remove a single environment variable.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RemoveOsEnv(key string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := system.RemoveOsEnv("foo")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CompareOsEnv">CompareOsEnv</span>
|
||||||
|
|
||||||
|
<p>Get env named by the key and compare it with comparedEnv.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CompareOsEnv(key, comparedEnv string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
system.SetOsEnv("foo", "foo_value")
|
||||||
|
res := system.CompareOsEnv("foo", "foo_value")
|
||||||
|
fmt.Println(res) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ExecCommand">CompareOsEnv</span>
|
||||||
|
|
||||||
|
<p>use shell /bin/bash -c(linux) or cmd (windows) to execute command.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ExecCommand(command string) (stdout, stderr string, err error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
out, errout, err := system.ExecCommand("ls")
|
||||||
|
fmt.Println(out)
|
||||||
|
fmt.Println(errout)
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <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/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
osBit := system.GetOsBits()
|
||||||
|
fmt.Println(osBit)
|
||||||
|
}
|
||||||
|
```
|
||||||
258
docs/system_zh-CN.md
Normal file
258
docs/system_zh-CN.md
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
# System
|
||||||
|
|
||||||
|
system 包含 os, runtime, shell command 相关函数。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/system/os.go](https://github.com/duke-git/lancet/blob/v1/system/os.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [IsWindows](#IsWindows)
|
||||||
|
- [IsLinux](#IsLinux)
|
||||||
|
- [IsMac](#IsMac)
|
||||||
|
- [GetOsEnv](#GetOsEnv)
|
||||||
|
- [SetOsEnv](#SetOsEnv)
|
||||||
|
- [RemoveOsEnv](#RemoveOsEnv)
|
||||||
|
- [CompareOsEnv](#CompareOsEnv)
|
||||||
|
- [ExecCommand](#ExecCommand)
|
||||||
|
- [GetOsBits](#GetOsBits)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation 文档
|
||||||
|
|
||||||
|
### <span id="IsWindows">IsWindows</span>
|
||||||
|
|
||||||
|
<p>检查当前操作系统是否是windows</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsWindows() bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isOsWindows := system.IsWindows()
|
||||||
|
fmt.Println(isOsWindows)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsLinux">IsLinux</span>
|
||||||
|
|
||||||
|
<p>检查当前操作系统是否是linux</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsLinux() bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isOsLinux := system.IsLinux()
|
||||||
|
fmt.Println(isOsLinux)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsMac">IsMac</span>
|
||||||
|
|
||||||
|
<p>检查当前操作系统是否是macos</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsMac() bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
isOsMac := system.IsMac
|
||||||
|
fmt.Println(isOsMac)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GetOsEnv">GetOsEnv</span>
|
||||||
|
|
||||||
|
<p>获取key命名的环境变量的值</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GetOsEnv(key string) string
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fooEnv := system.GetOsEnv("foo")
|
||||||
|
fmt.Println(fooEnv)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="SetOsEnv">SetOsEnv</span>
|
||||||
|
|
||||||
|
<p>设置由key命名的环境变量的值</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func SetOsEnv(key, value string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := system.SetOsEnv("foo", "foo_value")
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="RemoveOsEnv">RemoveOsEnv</span>
|
||||||
|
|
||||||
|
<p>删除单个环境变量</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RemoveOsEnv(key string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err := system.RemoveOsEnv("foo")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="CompareOsEnv">CompareOsEnv</span>
|
||||||
|
|
||||||
|
<p>获取key命名的环境变量值并与compareEnv进行比较</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func CompareOsEnv(key, comparedEnv string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
system.SetOsEnv("foo", "foo_value")
|
||||||
|
res := system.CompareOsEnv("foo", "foo_value")
|
||||||
|
fmt.Println(res) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ExecCommand">CompareOsEnv</span>
|
||||||
|
|
||||||
|
<p>使用shell /bin/bash -c(linux) 或 cmd (windows) 执行shell命令</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ExecCommand(command string) (stdout, stderr string, err error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
out, errout, err := system.ExecCommand("ls")
|
||||||
|
fmt.Println(out)
|
||||||
|
fmt.Println(errout)
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <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/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
osBit := system.GetOsBits()
|
||||||
|
fmt.Println(osBit)
|
||||||
|
}
|
||||||
|
```
|
||||||
833
docs/validator.md
Normal file
833
docs/validator.md
Normal file
@@ -0,0 +1,833 @@
|
|||||||
|
# Validator
|
||||||
|
|
||||||
|
Package validator contains some functions for data validation.
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Source:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/validator/validator.go](https://github.com/duke-git/lancet/blob/v1/validator/validator.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
- [ContainChinese](#ContainChinese)
|
||||||
|
- [ContainLetter](#ContainLetter)
|
||||||
|
- [ContainLower](#ContainLower)
|
||||||
|
- [ContainUpper](#ContainUpper)
|
||||||
|
- [IsAlpha](#IsAlpha)
|
||||||
|
- [IsAllUpper](#IsAllUpper)
|
||||||
|
- [IsAllLower](#IsAllLower)
|
||||||
|
- [IsBase64](#IsBase64)
|
||||||
|
- [IsChineseMobile](#IsChineseMobile)
|
||||||
|
- [IsChineseIdNum](#IsChineseIdNum)
|
||||||
|
- [IsChinesePhone](#IsChinesePhone)
|
||||||
|
- [IsCreditCard](#IsCreditCard)
|
||||||
|
- [IsDns](#IsDns)
|
||||||
|
- [IsEmail](#IsEmail)
|
||||||
|
- [IsEmptyString](#IsEmptyString)
|
||||||
|
- [IsFloatStr](#IsFloatStr)
|
||||||
|
- [IsNumberStr](#IsNumberStr)
|
||||||
|
- [IsJSON](#IsJSON)
|
||||||
|
- [IsRegexMatch](#IsRegexMatch)
|
||||||
|
- [IsIntStr](#IsIntStr)
|
||||||
|
- [IsIp](#IsIp)
|
||||||
|
- [IsIpV4](#IsIpV4)
|
||||||
|
- [IsIpV6](#IsIpV6)
|
||||||
|
- [IsStrongPassword](#IsStrongPassword)
|
||||||
|
- [IsUrl](#IsUrl)
|
||||||
|
- [IsWeakPassword](#IsWeakPassword)
|
||||||
|
- [IsZeroValue](#IsZeroValue)
|
||||||
|
- [IsGBK](#IsGBK)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
### <span id="ContainChinese">ContainChinese</span>
|
||||||
|
|
||||||
|
<p>Check if the string contain mandarin chinese.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ContainChinese(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.ContainChinese("你好")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.ContainChinese("你好hello")
|
||||||
|
fmt.Println(res2) //true
|
||||||
|
|
||||||
|
res3 := validator.ContainChinese("hello")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ContainLetter">ContainLetter</span>
|
||||||
|
|
||||||
|
<p>Check if the string contain at least one letter.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ContainLetter(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.ContainLetter("1bc")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.ContainLetter("123")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.ContainLetter("&@#$%^&*")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ContainLower">ContainLower</span>
|
||||||
|
|
||||||
|
<p>Check if the string contain at least one lower case letter a-z.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ContainLower(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.ContainLower("1bc")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.ContainLower("123")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.ContainLower("1BC")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ContainUpper">ContainUpper</span>
|
||||||
|
|
||||||
|
<p>Check if the string contain at least one upper case letter A-Z.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ContainUpper(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.ContainUpper("1bc")
|
||||||
|
fmt.Println(res1) //false
|
||||||
|
|
||||||
|
res2 := validator.ContainUpper("123")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.ContainUpper("1BC")
|
||||||
|
fmt.Println(res3) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsAlpha">IsAlpha</span>
|
||||||
|
|
||||||
|
<p>Check if the string contains only letters (a-zA-Z).</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsAlpha(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsAlpha("abc")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsAlpha("1bc")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.IsAlpha("")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsAllUpper">IsAllUpper</span>
|
||||||
|
|
||||||
|
<p>Check if string is all upper case letters A-Z.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsAllUpper(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsAllUpper("ABC")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsAllUpper("aBC")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsAllLower">IsAllLower</span>
|
||||||
|
|
||||||
|
<p>Check if string is all lower case letters a-z.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsAllLower(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsAllLower("abc")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsAllLower("abC")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsBase64">IsBase64</span>
|
||||||
|
|
||||||
|
<p>Check if the string is base64 string.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsBase64(base64 string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsBase64("aGVsbG8=")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsBase64("123456")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsChineseMobile">IsChineseMobile</span>
|
||||||
|
|
||||||
|
<p>Check if the string is valid chinese mobile number.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsChineseMobile(mobileNum string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsChineseMobile("13263527980")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsChineseMobile("434324324")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsChineseIdNum">IsChineseIdNum</span>
|
||||||
|
|
||||||
|
<p>Check if the string is chinese id number.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsChineseIdNum(id string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsChineseIdNum("210911192105130715")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsChineseIdNum("123456")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsChinesePhone">IsChinesePhone</span>
|
||||||
|
|
||||||
|
<p>Check if the string is chinese phone number.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsChinesePhone(phone string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsChinesePhone("010-32116675")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsChinesePhone("123-87562")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsCreditCard">IsCreditCard</span>
|
||||||
|
|
||||||
|
<p>Check if the string is credit card.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsCreditCard(creditCart string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsCreditCard("4111111111111111")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsCreditCard("123456")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsDns">IsDns</span>
|
||||||
|
|
||||||
|
<p>Check if the string is valid dns.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsDns(dns string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsDns("abc.com")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsDns("a.b.com")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.IsDns("http://abc.com")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsEmail">IsEmail</span>
|
||||||
|
|
||||||
|
<p>Check if the string is email address.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsEmail(email string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsEmail("abc@xyz.com")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsEmail("a.b@@com")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsEmptyString">IsEmptyString</span>
|
||||||
|
|
||||||
|
<p>Check if the string is empty or not.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsEmptyString(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsEmptyString("")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsEmptyString("abc")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsFloatStr">IsFloatStr</span>
|
||||||
|
|
||||||
|
<p>Check if the string can convert to a float.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsFloatStr(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsFloatStr("")) //false
|
||||||
|
fmt.Println(validator.IsFloatStr("12a")) //false
|
||||||
|
fmt.Println(validator.IsFloatStr("3.")) //true
|
||||||
|
fmt.Println(validator.IsFloatStr("+3.")) //true
|
||||||
|
fmt.Println(validator.IsFloatStr("-3.")) //true
|
||||||
|
fmt.Println(validator.IsFloatStr("12")) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsNumberStr">IsNumberStr</span>
|
||||||
|
|
||||||
|
<p>Check if the string can convert to a number.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsNumberStr(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsNumberStr("")) //false
|
||||||
|
fmt.Println(validator.IsNumberStr("12a")) //false
|
||||||
|
fmt.Println(validator.IsNumberStr("3.")) //true
|
||||||
|
fmt.Println(validator.IsNumberStr("+3.")) //true
|
||||||
|
fmt.Println(validator.IsNumberStr("-3.")) //true
|
||||||
|
fmt.Println(validator.IsNumberStr("+3e2")) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsJSON">IsJSON</span>
|
||||||
|
|
||||||
|
<p>Check if the string is valid JSON.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsJSON(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsJSON("")) //false
|
||||||
|
fmt.Println(validator.IsJSON("abc")) //false
|
||||||
|
fmt.Println(validator.IsJSON("{}")) //true
|
||||||
|
fmt.Println(validator.IsJSON("[]")) //true
|
||||||
|
fmt.Println(validator.IsJSON("123")) //true
|
||||||
|
fmt.Println(validator.IsJSON("{\"name\": \"test\"}")) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsRegexMatch">IsRegexMatch</span>
|
||||||
|
|
||||||
|
<p>Check if the string match the regexp.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsRegexMatch(s, regex string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsRegexMatch("abc", `^[a-zA-Z]+$`)) //true
|
||||||
|
fmt.Println(validator.IsRegexMatch("1ab", `^[a-zA-Z]+$`)) //false
|
||||||
|
fmt.Println(validator.IsRegexMatch("", `^[a-zA-Z]+$`)) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsIntStr">IsIntStr</span>
|
||||||
|
|
||||||
|
<p>Check if the string can convert to a integer.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsIntStr(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsIntStr("+3")) //true
|
||||||
|
fmt.Println(validator.IsIntStr("-3")) //true
|
||||||
|
fmt.Println(validator.IsIntStr("3.")) //false
|
||||||
|
fmt.Println(validator.IsIntStr("abc")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsIp">IsIp</span>
|
||||||
|
|
||||||
|
<p>Check if the string is a ip address.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsIp(ipstr string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsIp("127.0.0.1")) //true
|
||||||
|
fmt.Println(validator.IsIp("::0:0:0:0:0:0:1")) //true
|
||||||
|
fmt.Println(validator.IsIp("127.0.0")) //false
|
||||||
|
fmt.Println(validator.IsIp("127")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsIpV4">IsIpV4</span>
|
||||||
|
|
||||||
|
<p>Check if the string is a ipv4 address.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsIpV4(ipstr string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsIpV4("127.0.0.1")) //true
|
||||||
|
fmt.Println(validator.IsIpV4("::0:0:0:0:0:0:1")) //false
|
||||||
|
fmt.Println(validator.IsIpV4("127.0.0")) //false
|
||||||
|
fmt.Println(validator.IsIpV4("127")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsIpV6">IsIpV6</span>
|
||||||
|
|
||||||
|
<p>Check if the string is a ipv6 address.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsIpV6(ipstr string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsIpV6("127.0.0.1")) //false
|
||||||
|
fmt.Println(validator.IsIpV6("::0:0:0:0:0:0:1")) //true
|
||||||
|
fmt.Println(validator.IsIpV6("127.0.0")) //false
|
||||||
|
fmt.Println(validator.IsIpV6("127")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsStrongPassword">IsStrongPassword</span>
|
||||||
|
|
||||||
|
<p>Check if the string is strong password (alpha(lower+upper) + number + special chars(!@#$%^&*()?><)).</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsStrongPassword(password string, length int) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsStrongPassword("abc", 3)) //false
|
||||||
|
fmt.Println(validator.IsStrongPassword("abc123", 6)) //false
|
||||||
|
fmt.Println(validator.IsStrongPassword("abcABC", 6)) //false
|
||||||
|
fmt.Println(validator.IsStrongPassword("abcABC123@#$", 16)) //false
|
||||||
|
fmt.Println(validator.IsStrongPassword("abcABC123@#$", 12)) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsUrl">IsUrl</span>
|
||||||
|
|
||||||
|
<p>Check if the string is url.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsUrl(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsUrl("http://abc.com")) //true
|
||||||
|
fmt.Println(validator.IsUrl("abc.com")) //true
|
||||||
|
fmt.Println(validator.IsUrl("a.b.com")) //true
|
||||||
|
fmt.Println(validator.IsUrl("abc")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsWeakPassword">IsWeakPassword</span>
|
||||||
|
|
||||||
|
<p>Check if the string is weak password(only letter or only number or letter + number)
|
||||||
|
.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsWeakPassword(password string, length int) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsWeakPassword("abc")) //true
|
||||||
|
fmt.Println(validator.IsWeakPassword("123")) //true
|
||||||
|
fmt.Println(validator.IsWeakPassword("abc123")) //true
|
||||||
|
fmt.Println(validator.IsWeakPassword("abc123@#$")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsZeroValue">IsZeroValue</span>
|
||||||
|
|
||||||
|
<p>Checks if passed value is a zero value.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsZeroValue(value any) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsZeroValue(nil)) //true
|
||||||
|
fmt.Println(validator.IsZeroValue(0)) //true
|
||||||
|
fmt.Println(validator.IsZeroValue("")) //true
|
||||||
|
fmt.Println(validator.IsZeroValue([]int)) //true
|
||||||
|
fmt.Println(validator.IsZeroValue(interface{})) //true
|
||||||
|
|
||||||
|
fmt.Println(validator.IsZeroValue("0")) //false
|
||||||
|
fmt.Println(validator.IsZeroValue("nil")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsGBK">IsGBK</span>
|
||||||
|
|
||||||
|
<p>Checks if data encoding is gbk(Chinese character internal code extension specification). this function is implemented by whether double bytes fall within the encoding range of gbk,while each byte of utf-8 encoding format falls within the encoding range of gbk.Therefore, utf8.valid() should be called first to check whether it is not utf-8 encoding and then call IsGBK() to check gbk encoding. like the example.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsGBK(data []byte) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := []byte("你好")
|
||||||
|
|
||||||
|
// check utf8 first
|
||||||
|
if utf8.Valid(data) {
|
||||||
|
fmt.Println("data encoding is utf-8")
|
||||||
|
}else if(validator.IsGBK(data)) {
|
||||||
|
fmt.Println("data encoding is GBK")
|
||||||
|
}
|
||||||
|
fmt.Println("data encoding is unknown")
|
||||||
|
}
|
||||||
|
```
|
||||||
833
docs/validator_zh-CN.md
Normal file
833
docs/validator_zh-CN.md
Normal file
@@ -0,0 +1,833 @@
|
|||||||
|
# Validator
|
||||||
|
|
||||||
|
validator 验证器包,包含常用字符串格式验证函数。
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 源码:
|
||||||
|
|
||||||
|
[https://github.com/duke-git/lancet/blob/v1/validator/validator.go](https://github.com/duke-git/lancet/blob/v1/validator/validator.go)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 用法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 目录:
|
||||||
|
|
||||||
|
- [ContainChinese](#ContainChinese)
|
||||||
|
- [ContainLetter](#ContainLetter)
|
||||||
|
- [ContainLower](#ContainLower)
|
||||||
|
- [ContainUpper](#ContainUpper)
|
||||||
|
- [IsAlpha](#IsAlpha)
|
||||||
|
- [IsAllUpper](#IsAllUpper)
|
||||||
|
- [IsAllLower](#IsAllLower)
|
||||||
|
- [IsBase64](#IsBase64)
|
||||||
|
- [IsChineseMobile](#IsChineseMobile)
|
||||||
|
- [IsChineseIdNum](#IsChineseIdNum)
|
||||||
|
- [IsChinesePhone](#IsChinesePhone)
|
||||||
|
- [IsCreditCard](#IsCreditCard)
|
||||||
|
- [IsDns](#IsDns)
|
||||||
|
- [IsEmail](#IsEmail)
|
||||||
|
- [IsEmptyString](#IsEmptyString)
|
||||||
|
- [IsFloatStr](#IsFloatStr)
|
||||||
|
- [IsNumberStr](#IsNumberStr)
|
||||||
|
- [IsJSON](#IsJSON)
|
||||||
|
- [IsRegexMatch](#IsRegexMatch)
|
||||||
|
- [IsIntStr](#IsIntStr)
|
||||||
|
- [IsIp](#IsIp)
|
||||||
|
- [IsIpV4](#IsIpV4)
|
||||||
|
- [IsIpV6](#IsIpV6)
|
||||||
|
- [IsStrongPassword](#IsStrongPassword)
|
||||||
|
- [IsUrl](#IsUrl)
|
||||||
|
- [IsWeakPassword](#IsWeakPassword)
|
||||||
|
- [IsZeroValue](#IsZeroValue)
|
||||||
|
- [IsGBK](#IsGBK)
|
||||||
|
|
||||||
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
|
## 文档
|
||||||
|
|
||||||
|
### <span id="ContainChinese">ContainChinese</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否包含中文字符</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ContainChinese(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.ContainChinese("你好")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.ContainChinese("你好hello")
|
||||||
|
fmt.Println(res2) //true
|
||||||
|
|
||||||
|
res3 := validator.ContainChinese("hello")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ContainLetter">ContainLetter</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否包含至少一个英文字母</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ContainLetter(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.ContainLetter("1bc")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.ContainLetter("123")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.ContainLetter("&@#$%^&*")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ContainLower">ContainLower</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否包含至少一个英文小写字母</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ContainLower(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.ContainLower("1bc")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.ContainLower("123")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.ContainLower("1BC")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="ContainUpper">ContainUpper</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否包含至少一个英文大写字母.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ContainUpper(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.ContainUpper("1bc")
|
||||||
|
fmt.Println(res1) //false
|
||||||
|
|
||||||
|
res2 := validator.ContainUpper("123")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.ContainUpper("1BC")
|
||||||
|
fmt.Println(res3) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsAlpha">IsAlpha</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否只包含英文字母</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsAlpha(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsAlpha("abc")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsAlpha("1bc")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.IsAlpha("")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsAllUpper">IsAllUpper</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否全是大写英文字母</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsAllUpper(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsAllUpper("ABC")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsAllUpper("aBC")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsAllLower">IsAllLower</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否全是小写英文字母</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsAllLower(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsAllLower("abc")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsAllLower("abC")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsBase64">IsBase64</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是base64编码</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsBase64(base64 string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsBase64("aGVsbG8=")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsBase64("123456")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsChineseMobile">IsChineseMobile</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是中国手机号码</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsChineseMobile(mobileNum string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsChineseMobile("13263527980")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsChineseMobile("434324324")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsChineseIdNum">IsChineseIdNum</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是中国身份证号码</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsChineseIdNum(id string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsChineseIdNum("210911192105130715")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsChineseIdNum("123456")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsChinesePhone">IsChinesePhone</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是中国电话座机号码</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsChinesePhone(phone string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsChinesePhone("010-32116675")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsChinesePhone("123-87562")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsCreditCard">IsCreditCard</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是信用卡号码</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsCreditCard(creditCart string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsCreditCard("4111111111111111")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsCreditCard("123456")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsDns">IsDns</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是有效dns</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsDns(dns string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsDns("abc.com")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsDns("a.b.com")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
|
||||||
|
res3 := validator.IsDns("http://abc.com")
|
||||||
|
fmt.Println(res3) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsEmail">IsEmail</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是有效电子邮件地址</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsEmail(email string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsEmail("abc@xyz.com")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsEmail("a.b@@com")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsEmptyString">IsEmptyString</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是空字符串</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsEmptyString(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
res1 := validator.IsEmptyString("")
|
||||||
|
fmt.Println(res1) //true
|
||||||
|
|
||||||
|
res2 := validator.IsEmptyString("abc")
|
||||||
|
fmt.Println(res2) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsFloatStr">IsFloatStr</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是可以转换为浮点数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsFloatStr(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsFloatStr("")) //false
|
||||||
|
fmt.Println(validator.IsFloatStr("12a")) //false
|
||||||
|
fmt.Println(validator.IsFloatStr("3.")) //true
|
||||||
|
fmt.Println(validator.IsFloatStr("+3.")) //true
|
||||||
|
fmt.Println(validator.IsFloatStr("-3.")) //true
|
||||||
|
fmt.Println(validator.IsFloatStr("12")) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsNumberStr">IsNumberStr</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是可以转换为数字</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsNumberStr(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsNumberStr("")) //false
|
||||||
|
fmt.Println(validator.IsNumberStr("12a")) //false
|
||||||
|
fmt.Println(validator.IsNumberStr("3.")) //true
|
||||||
|
fmt.Println(validator.IsNumberStr("+3.")) //true
|
||||||
|
fmt.Println(validator.IsNumberStr("-3.")) //true
|
||||||
|
fmt.Println(validator.IsNumberStr("+3e2")) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsJSON">IsJSON</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是有效json</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsJSON(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsJSON("")) //false
|
||||||
|
fmt.Println(validator.IsJSON("abc")) //false
|
||||||
|
fmt.Println(validator.IsJSON("{}")) //true
|
||||||
|
fmt.Println(validator.IsJSON("[]")) //true
|
||||||
|
fmt.Println(validator.IsJSON("123")) //true
|
||||||
|
fmt.Println(validator.IsJSON("{\"name\": \"test\"}")) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsRegexMatch">IsRegexMatch</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否可以匹配正则表达式</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsRegexMatch(s, regex string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsRegexMatch("abc", `^[a-zA-Z]+$`)) //true
|
||||||
|
fmt.Println(validator.IsRegexMatch("1ab", `^[a-zA-Z]+$`)) //false
|
||||||
|
fmt.Println(validator.IsRegexMatch("", `^[a-zA-Z]+$`)) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsIntStr">IsIntStr</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是可以转换为整数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsIntStr(s string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsIntStr("+3")) //true
|
||||||
|
fmt.Println(validator.IsIntStr("-3")) //true
|
||||||
|
fmt.Println(validator.IsIntStr("3.")) //false
|
||||||
|
fmt.Println(validator.IsIntStr("abc")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsIp">IsIp</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是ip地址</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsIp(ipstr string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsIp("127.0.0.1")) //true
|
||||||
|
fmt.Println(validator.IsIp("::0:0:0:0:0:0:1")) //true
|
||||||
|
fmt.Println(validator.IsIp("127.0.0")) //false
|
||||||
|
fmt.Println(validator.IsIp("127")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsIpV4">IsIpV4</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是ipv4地址</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsIpV4(ipstr string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsIpV4("127.0.0.1")) //true
|
||||||
|
fmt.Println(validator.IsIpV4("::0:0:0:0:0:0:1")) //false
|
||||||
|
fmt.Println(validator.IsIpV4("127.0.0")) //false
|
||||||
|
fmt.Println(validator.IsIpV4("127")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsIpV6">IsIpV6</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是ipv6地址</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsIpV6(ipstr string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsIpV6("127.0.0.1")) //false
|
||||||
|
fmt.Println(validator.IsIpV6("::0:0:0:0:0:0:1")) //true
|
||||||
|
fmt.Println(validator.IsIpV6("127.0.0")) //false
|
||||||
|
fmt.Println(validator.IsIpV6("127")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsStrongPassword">IsStrongPassword</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是强密码:(alpha(lower+upper) + number + special chars(!@#$%^&*()?><))</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsStrongPassword(password string, length int) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsStrongPassword("abc", 3)) //false
|
||||||
|
fmt.Println(validator.IsStrongPassword("abc123", 6)) //false
|
||||||
|
fmt.Println(validator.IsStrongPassword("abcABC", 6)) //false
|
||||||
|
fmt.Println(validator.IsStrongPassword("abcABC123@#$", 16)) //false
|
||||||
|
fmt.Println(validator.IsStrongPassword("abcABC123@#$", 12)) //true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsUrl">IsUrl</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是url</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsUrl(str string) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsUrl("http://abc.com")) //true
|
||||||
|
fmt.Println(validator.IsUrl("abc.com")) //true
|
||||||
|
fmt.Println(validator.IsUrl("a.b.com")) //true
|
||||||
|
fmt.Println(validator.IsUrl("abc")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsWeakPassword">IsWeakPassword</span>
|
||||||
|
|
||||||
|
<p>验证字符串是否是弱密码:(only letter or only number or letter + number)
|
||||||
|
.</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsWeakPassword(password string, length int) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsWeakPassword("abc")) //true
|
||||||
|
fmt.Println(validator.IsWeakPassword("123")) //true
|
||||||
|
fmt.Println(validator.IsWeakPassword("abc123")) //true
|
||||||
|
fmt.Println(validator.IsWeakPassword("abc123@#$")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsZeroValue">IsZeroValue</span>
|
||||||
|
|
||||||
|
<p>判断传入的参数值是否为零值</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsZeroValue(value any) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(validator.IsZeroValue(nil)) //true
|
||||||
|
fmt.Println(validator.IsZeroValue(0)) //true
|
||||||
|
fmt.Println(validator.IsZeroValue("")) //true
|
||||||
|
fmt.Println(validator.IsZeroValue([]int)) //true
|
||||||
|
fmt.Println(validator.IsZeroValue(interface{})) //true
|
||||||
|
|
||||||
|
fmt.Println(validator.IsZeroValue("0")) //false
|
||||||
|
fmt.Println(validator.IsZeroValue("nil")) //false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="IsGBK">IsGBK</span>
|
||||||
|
|
||||||
|
<p>检查数据编码是否为gbk(汉字内部代码扩展规范)。该函数的实现取决于双字节是否在gbk的编码范围内,而utf-8编码格式的每个字节都在gbk编码范围内。因此,应该首先调用utf8.valid检查它是否是utf-8编码,然后调用IsGBK检查gbk编码。如示例所示。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsGBK(data []byte) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>例子:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := []byte("你好")
|
||||||
|
|
||||||
|
// 先检查utf8编码
|
||||||
|
if utf8.Valid(data) {
|
||||||
|
fmt.Println("data encoding is utf-8")
|
||||||
|
}else if(validator.IsGBK(data)) {
|
||||||
|
fmt.Println("data encoding is GBK")
|
||||||
|
}
|
||||||
|
fmt.Println("data encoding is unknown")
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -8,11 +8,13 @@ import (
|
|||||||
"archive/zip"
|
"archive/zip"
|
||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@@ -40,6 +42,11 @@ func CreateFile(path string) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateDir create directory in absolute path. param `absPath` like /a/, /a/b/
|
||||||
|
func CreateDir(absPath string) error {
|
||||||
|
return os.MkdirAll(path.Dir(absPath), os.ModePerm)
|
||||||
|
}
|
||||||
|
|
||||||
// IsDir checks if the path is directory or not
|
// IsDir checks if the path is directory or not
|
||||||
func IsDir(path string) bool {
|
func IsDir(path string) bool {
|
||||||
file, err := os.Stat(path)
|
file, err := os.Stat(path)
|
||||||
@@ -214,7 +221,11 @@ func UnZip(zipFile string, destPath string) error {
|
|||||||
defer zipReader.Close()
|
defer zipReader.Close()
|
||||||
|
|
||||||
for _, f := range zipReader.File {
|
for _, f := range zipReader.File {
|
||||||
path := filepath.Join(destPath, f.Name)
|
//issue#62: fix ZipSlip bug
|
||||||
|
path, err := safeFilepathJoin(destPath, f.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if f.FileInfo().IsDir() {
|
if f.FileInfo().IsDir() {
|
||||||
os.MkdirAll(path, os.ModePerm)
|
os.MkdirAll(path, os.ModePerm)
|
||||||
} else {
|
} else {
|
||||||
@@ -243,6 +254,17 @@ func UnZip(zipFile string, destPath string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func safeFilepathJoin(path1, path2 string) (string, error) {
|
||||||
|
relPath, err := filepath.Rel(".", path2)
|
||||||
|
if err != nil || strings.HasPrefix(relPath, "..") {
|
||||||
|
return "", fmt.Errorf("(zipslip) filepath is unsafe %q: %v", path2, err)
|
||||||
|
}
|
||||||
|
if path1 == "" {
|
||||||
|
path1 = "."
|
||||||
|
}
|
||||||
|
return filepath.Join(path1, filepath.Join("/", relPath)), nil
|
||||||
|
}
|
||||||
|
|
||||||
// IsLink checks if a file is symbol link or not
|
// IsLink checks if a file is symbol link or not
|
||||||
func IsLink(path string) bool {
|
func IsLink(path string) bool {
|
||||||
fi, err := os.Lstat(path)
|
fi, err := os.Lstat(path)
|
||||||
|
|||||||
@@ -33,6 +33,27 @@ func TestCreateFile(t *testing.T) {
|
|||||||
os.Remove(f)
|
os.Remove(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCreateDir(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestCreateDir")
|
||||||
|
|
||||||
|
pwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
|
||||||
|
dirPath := pwd + "/a/"
|
||||||
|
err = CreateDir(dirPath)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(true, IsExist(dirPath))
|
||||||
|
os.Remove(dirPath)
|
||||||
|
assert.Equal(false, IsExist(dirPath))
|
||||||
|
}
|
||||||
|
|
||||||
func TestIsDir(t *testing.T) {
|
func TestIsDir(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestIsDir")
|
assert := internal.NewAssert(t, "TestIsDir")
|
||||||
|
|
||||||
@@ -79,7 +100,7 @@ func TestListFileNames(t *testing.T) {
|
|||||||
filesInPath, err := ListFileNames("../datetime/")
|
filesInPath, err := ListFileNames("../datetime/")
|
||||||
assert.IsNil(err)
|
assert.IsNil(err)
|
||||||
|
|
||||||
expected := []string{"datetime.go", "datetime_test.go"}
|
expected := []string{"conversion.go", "conversion_test.go", "datetime.go", "datetime_test.go"}
|
||||||
assert.Equal(expected, filesInPath)
|
assert.Equal(expected, filesInPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
func After(n int, fn interface{}) func(args ...interface{}) []reflect.Value {
|
func After(n int, fn interface{}) func(args ...interface{}) []reflect.Value {
|
||||||
// Catch programming error while constructing the closure
|
// Catch programming error while constructing the closure
|
||||||
mustBeFunction(fn)
|
mustBeFunction(fn)
|
||||||
|
|
||||||
return func(args ...interface{}) []reflect.Value {
|
return func(args ...interface{}) []reflect.Value {
|
||||||
n--
|
n--
|
||||||
if n < 1 {
|
if n < 1 {
|
||||||
@@ -66,12 +67,18 @@ func Compose(fnList ...func(...interface{}) interface{}) func(...interface{}) in
|
|||||||
|
|
||||||
// Delay make the function execution after delayed time
|
// Delay make the function execution after delayed time
|
||||||
func Delay(delay time.Duration, fn interface{}, args ...interface{}) {
|
func Delay(delay time.Duration, fn interface{}, args ...interface{}) {
|
||||||
|
// Catch programming error while constructing the closure
|
||||||
|
mustBeFunction(fn)
|
||||||
|
|
||||||
time.Sleep(delay)
|
time.Sleep(delay)
|
||||||
invokeFunc(fn, args...)
|
invokeFunc(fn, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debounced creates a debounced function that delays invoking fn until after wait duration have elapsed since the last time the debounced function was invoked.
|
// Debounced creates a debounced function that delays invoking fn until after wait duration have elapsed since the last time the debounced function was invoked.
|
||||||
func Debounced(fn func(), duration time.Duration) func() {
|
func Debounced(fn func(), duration time.Duration) func() {
|
||||||
|
// Catch programming error while constructing the closure
|
||||||
|
mustBeFunction(fn)
|
||||||
|
|
||||||
timer := time.NewTimer(duration)
|
timer := time.NewTimer(duration)
|
||||||
timer.Stop()
|
timer.Stop()
|
||||||
|
|
||||||
@@ -91,6 +98,7 @@ func Debounced(fn func(), duration time.Duration) func() {
|
|||||||
func Schedule(d time.Duration, fn interface{}, args ...interface{}) chan bool {
|
func Schedule(d time.Duration, fn interface{}, args ...interface{}) chan bool {
|
||||||
// Catch programming error while constructing the closure
|
// Catch programming error while constructing the closure
|
||||||
mustBeFunction(fn)
|
mustBeFunction(fn)
|
||||||
|
|
||||||
quit := make(chan bool)
|
quit := make(chan bool)
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
@@ -105,3 +113,15 @@ func Schedule(d time.Duration, fn interface{}, args ...interface{}) chan bool {
|
|||||||
|
|
||||||
return quit
|
return quit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pipeline takes a list of functions and returns a function whose param will be passed into
|
||||||
|
// the functions one by one.
|
||||||
|
func Pipeline(funcs ...func(interface{}) interface{}) func(interface{}) interface{} {
|
||||||
|
return func(arg interface{}) (result interface{}) {
|
||||||
|
result = arg
|
||||||
|
for _, fn := range funcs {
|
||||||
|
result = fn(result)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -130,3 +130,21 @@ func TestSchedule(t *testing.T) {
|
|||||||
expected := []string{"*", "*", "*", "*", "*"}
|
expected := []string{"*", "*", "*", "*", "*"}
|
||||||
assert.Equal(expected, res)
|
assert.Equal(expected, res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPipeline(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestPipeline")
|
||||||
|
|
||||||
|
addOne := func(x interface{}) interface{} {
|
||||||
|
return x.(int) + 1
|
||||||
|
}
|
||||||
|
double := func(x interface{}) interface{} {
|
||||||
|
return 2 * x.(int)
|
||||||
|
}
|
||||||
|
square := func(x interface{}) interface{} {
|
||||||
|
return x.(int) * x.(int)
|
||||||
|
}
|
||||||
|
|
||||||
|
f := Pipeline(addOne, double, square)
|
||||||
|
|
||||||
|
assert.Equal(36, f(2))
|
||||||
|
}
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -1,3 +1,5 @@
|
|||||||
module github.com/duke-git/lancet
|
module github.com/duke-git/lancet
|
||||||
|
|
||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
|
require golang.org/x/text v0.5.0
|
||||||
|
|||||||
25
go.sum
Normal file
25
go.sum
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
|
||||||
|
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
92
mathutil/mathutil.go
Normal file
92
mathutil/mathutil.go
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
// Copyright 2021 dudaodong@gmail.com. All rights reserved.
|
||||||
|
// Use of this source code is governed by MIT license
|
||||||
|
|
||||||
|
// Package mathutil implements some functions for math calculation.
|
||||||
|
package mathutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Exponent calculate x^n
|
||||||
|
func Exponent(x, n int64) int64 {
|
||||||
|
if n == 0 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
t := Exponent(x, n/2)
|
||||||
|
|
||||||
|
if n%2 == 1 {
|
||||||
|
return t * t * x
|
||||||
|
}
|
||||||
|
|
||||||
|
return t * t
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fibonacci calculate fibonacci number before n
|
||||||
|
func Fibonacci(first, second, n int) int {
|
||||||
|
if n <= 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if n < 3 {
|
||||||
|
return 1
|
||||||
|
} else if n == 3 {
|
||||||
|
return first + second
|
||||||
|
} else {
|
||||||
|
return Fibonacci(second, first+second, n-1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Factorial calculate x!
|
||||||
|
func Factorial(x uint) uint {
|
||||||
|
var f uint = 1
|
||||||
|
for ; x > 1; x-- {
|
||||||
|
f *= x
|
||||||
|
}
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Percent calculate the percentage of val to total
|
||||||
|
func Percent(val, total float64, n int) float64 {
|
||||||
|
if total == 0 {
|
||||||
|
return float64(0)
|
||||||
|
}
|
||||||
|
tmp := val / total * 100
|
||||||
|
res := RoundToFloat(tmp, n)
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// RoundToString round up to n decimal places
|
||||||
|
func RoundToString(x float64, n int) string {
|
||||||
|
tmp := math.Pow(10.0, float64(n))
|
||||||
|
x *= tmp
|
||||||
|
x = math.Round(x)
|
||||||
|
res := strconv.FormatFloat(x/tmp, 'f', n, 64)
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// RoundToFloat round up to n decimal places
|
||||||
|
func RoundToFloat(x float64, n int) float64 {
|
||||||
|
tmp := math.Pow(10.0, float64(n))
|
||||||
|
x *= tmp
|
||||||
|
x = math.Round(x)
|
||||||
|
return x / tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
// TruncRound round off n decimal places
|
||||||
|
func TruncRound(x float64, n int) float64 {
|
||||||
|
floatStr := fmt.Sprintf("%."+strconv.Itoa(n+1)+"f", x)
|
||||||
|
temp := strings.Split(floatStr, ".")
|
||||||
|
var newFloat string
|
||||||
|
if len(temp) < 2 || n >= len(temp[1]) {
|
||||||
|
newFloat = floatStr
|
||||||
|
} else {
|
||||||
|
newFloat = temp[0] + "." + temp[1][:n]
|
||||||
|
}
|
||||||
|
res, _ := strconv.ParseFloat(newFloat, 64)
|
||||||
|
return res
|
||||||
|
}
|
||||||
72
mathutil/mathutil_test.go
Normal file
72
mathutil/mathutil_test.go
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
package mathutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/duke-git/lancet/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestExponent(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestExponent")
|
||||||
|
|
||||||
|
assert.Equal(int64(1), Exponent(10, 0))
|
||||||
|
assert.Equal(int64(10), Exponent(10, 1))
|
||||||
|
assert.Equal(int64(100), Exponent(10, 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFibonacci(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestFibonacci")
|
||||||
|
|
||||||
|
assert.Equal(0, Fibonacci(1, 1, 0))
|
||||||
|
assert.Equal(1, Fibonacci(1, 1, 1))
|
||||||
|
assert.Equal(1, Fibonacci(1, 1, 2))
|
||||||
|
assert.Equal(5, Fibonacci(1, 1, 5))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFactorial(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestFactorial")
|
||||||
|
|
||||||
|
assert.Equal(uint(1), Factorial(0))
|
||||||
|
assert.Equal(uint(1), Factorial(1))
|
||||||
|
assert.Equal(uint(2), Factorial(2))
|
||||||
|
assert.Equal(uint(6), Factorial(3))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPercent(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestPercent")
|
||||||
|
|
||||||
|
assert.Equal(float64(50), Percent(1, 2, 2))
|
||||||
|
assert.Equal(float64(33.33), Percent(0.1, 0.3, 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRoundToFloat(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestRoundToFloat")
|
||||||
|
|
||||||
|
assert.Equal(RoundToFloat(0, 0), float64(0))
|
||||||
|
assert.Equal(RoundToFloat(0, 1), float64(0))
|
||||||
|
assert.Equal(RoundToFloat(0.124, 2), float64(0.12))
|
||||||
|
assert.Equal(RoundToFloat(0.125, 2), float64(0.13))
|
||||||
|
assert.Equal(RoundToFloat(0.125, 3), float64(0.125))
|
||||||
|
assert.Equal(RoundToFloat(33.33333, 2), float64(33.33))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRoundToString(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestRoundToString")
|
||||||
|
|
||||||
|
assert.Equal(RoundToString(0, 0), "0")
|
||||||
|
assert.Equal(RoundToString(0, 1), "0.0")
|
||||||
|
assert.Equal(RoundToString(0.124, 2), "0.12")
|
||||||
|
assert.Equal(RoundToString(0.125, 2), "0.13")
|
||||||
|
assert.Equal(RoundToString(0.125, 3), "0.125")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTruncRound(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestTruncRound")
|
||||||
|
|
||||||
|
assert.Equal(TruncRound(0, 0), float64(0))
|
||||||
|
assert.Equal(TruncRound(0, 1), float64(0))
|
||||||
|
assert.Equal(TruncRound(0.124, 2), float64(0.12))
|
||||||
|
assert.Equal(TruncRound(0.125, 2), float64(0.12))
|
||||||
|
assert.Equal(TruncRound(0.125, 3), float64(0.125))
|
||||||
|
assert.Equal(TruncRound(33.33333, 2), float64(33.33))
|
||||||
|
}
|
||||||
@@ -6,7 +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]interface{},
|
// 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[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
|
||||||
228
netutil/http_client.go
Normal file
228
netutil/http_client.go
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
package netutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/tls"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"reflect"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/duke-git/lancet/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HttpRequest struct is a composed http request
|
||||||
|
type HttpRequest struct {
|
||||||
|
RawURL string
|
||||||
|
Method string
|
||||||
|
Headers http.Header
|
||||||
|
QueryParams url.Values
|
||||||
|
FormData url.Values
|
||||||
|
Body []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// HttpClientConfig contains some configurations for http client
|
||||||
|
type HttpClientConfig struct {
|
||||||
|
SSLEnabled bool
|
||||||
|
TLSConfig *tls.Config
|
||||||
|
Compressed bool
|
||||||
|
HandshakeTimeout time.Duration
|
||||||
|
ResponseTimeout time.Duration
|
||||||
|
Verbose bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultHttpClientConfig defalut client config
|
||||||
|
var defaultHttpClientConfig = &HttpClientConfig{
|
||||||
|
Compressed: false,
|
||||||
|
HandshakeTimeout: 20 * time.Second,
|
||||||
|
ResponseTimeout: 40 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
// HttpClient is used for sending http request
|
||||||
|
type HttpClient struct {
|
||||||
|
*http.Client
|
||||||
|
TLS *tls.Config
|
||||||
|
Request *http.Request
|
||||||
|
Config HttpClientConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewHttpClient make a HttpClient instance
|
||||||
|
func NewHttpClient() *HttpClient {
|
||||||
|
client := &HttpClient{
|
||||||
|
Client: &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
TLSHandshakeTimeout: defaultHttpClientConfig.HandshakeTimeout,
|
||||||
|
ResponseHeaderTimeout: defaultHttpClientConfig.ResponseTimeout,
|
||||||
|
DisableCompression: !defaultHttpClientConfig.Compressed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Config: *defaultHttpClientConfig,
|
||||||
|
}
|
||||||
|
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewHttpClientWithConfig make a HttpClient instance with pass config
|
||||||
|
func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient {
|
||||||
|
if config == nil {
|
||||||
|
config = defaultHttpClientConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
client := &HttpClient{
|
||||||
|
Client: &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
TLSHandshakeTimeout: config.HandshakeTimeout,
|
||||||
|
ResponseHeaderTimeout: config.ResponseTimeout,
|
||||||
|
DisableCompression: !config.Compressed,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Config: *config,
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.SSLEnabled {
|
||||||
|
client.TLS = config.TLSConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendRequest send http request
|
||||||
|
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error) {
|
||||||
|
err := validateRequest(request)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rawUrl := request.RawURL
|
||||||
|
|
||||||
|
req, err := http.NewRequest(request.Method, rawUrl, bytes.NewBuffer(request.Body))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
client.setTLS(rawUrl)
|
||||||
|
client.setHeader(req, request.Headers)
|
||||||
|
client.setQueryParam(req, rawUrl, request.QueryParams)
|
||||||
|
|
||||||
|
if request.FormData != nil {
|
||||||
|
client.setFormData(req, request.FormData)
|
||||||
|
}
|
||||||
|
|
||||||
|
client.Request = req
|
||||||
|
|
||||||
|
resp, err := client.Client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecodeResponse decode response into target object
|
||||||
|
func (client *HttpClient) DecodeResponse(resp *http.Response, target interface{}) error {
|
||||||
|
if resp == nil {
|
||||||
|
return errors.New("invalid target param")
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
return json.NewDecoder(resp.Body).Decode(target)
|
||||||
|
}
|
||||||
|
|
||||||
|
// setTLS set http client transport TLSClientConfig
|
||||||
|
func (client *HttpClient) setTLS(rawUrl string) {
|
||||||
|
if strings.HasPrefix(rawUrl, "https") {
|
||||||
|
if transport, ok := client.Client.Transport.(*http.Transport); ok {
|
||||||
|
transport.TLSClientConfig = client.TLS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// setHeader set http rquest header
|
||||||
|
func (client *HttpClient) setHeader(req *http.Request, headers http.Header) {
|
||||||
|
if headers == nil {
|
||||||
|
headers = make(http.Header)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := headers["Accept"]; !ok {
|
||||||
|
headers["Accept"] = []string{"*/*"}
|
||||||
|
}
|
||||||
|
if _, ok := headers["Accept-Encoding"]; !ok && client.Config.Compressed {
|
||||||
|
headers["Accept-Encoding"] = []string{"deflate, gzip"}
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header = headers
|
||||||
|
}
|
||||||
|
|
||||||
|
// setQueryParam set http request query string param
|
||||||
|
func (client *HttpClient) setQueryParam(req *http.Request, reqUrl string, queryParam url.Values) error {
|
||||||
|
if queryParam != nil {
|
||||||
|
if !strings.Contains(reqUrl, "?") {
|
||||||
|
reqUrl = reqUrl + "?" + queryParam.Encode()
|
||||||
|
} else {
|
||||||
|
reqUrl = reqUrl + "&" + queryParam.Encode()
|
||||||
|
}
|
||||||
|
u, err := url.Parse(reqUrl)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.URL = u
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (client *HttpClient) setFormData(req *http.Request, values url.Values) {
|
||||||
|
formData := []byte(values.Encode())
|
||||||
|
req.Body = ioutil.NopCloser(bytes.NewReader(formData))
|
||||||
|
req.ContentLength = int64(len(formData))
|
||||||
|
}
|
||||||
|
|
||||||
|
// validateRequest check if a request has url, and valid method.
|
||||||
|
func validateRequest(req *HttpRequest) error {
|
||||||
|
if req.RawURL == "" {
|
||||||
|
return errors.New("invalid request url")
|
||||||
|
}
|
||||||
|
|
||||||
|
// common HTTP methods
|
||||||
|
methods := []string{"GET", "POST", "PUT", "DELETE", "PATCH",
|
||||||
|
"HEAD", "CONNECT", "OPTIONS", "TRACE"}
|
||||||
|
|
||||||
|
if !slice.Contain(methods, strings.ToUpper(req.Method)) {
|
||||||
|
return errors.New("invalid request method")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// StructToUrlValues convert struct to url valuse,
|
||||||
|
// only convert the field which is exported and has `json` tag
|
||||||
|
func StructToUrlValues(targetStruct interface{}) url.Values {
|
||||||
|
rv := reflect.ValueOf(targetStruct)
|
||||||
|
rt := reflect.TypeOf(targetStruct)
|
||||||
|
|
||||||
|
if rt.Kind() == reflect.Ptr {
|
||||||
|
rt = rt.Elem()
|
||||||
|
}
|
||||||
|
if rt.Kind() != reflect.Struct {
|
||||||
|
panic(fmt.Errorf("data type %T not support, shuld be struct or pointer to struct", targetStruct))
|
||||||
|
}
|
||||||
|
|
||||||
|
result := url.Values{}
|
||||||
|
|
||||||
|
fieldNum := rt.NumField()
|
||||||
|
pattern := `^[A-Z]`
|
||||||
|
regex := regexp.MustCompile(pattern)
|
||||||
|
for i := 0; i < fieldNum; i++ {
|
||||||
|
name := rt.Field(i).Name
|
||||||
|
tag := rt.Field(i).Tag.Get("json")
|
||||||
|
if regex.MatchString(name) && tag != "" {
|
||||||
|
result.Add(tag, fmt.Sprintf("%v", rv.Field(i).Interface()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
95
netutil/http_client_test.go
Normal file
95
netutil/http_client_test.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
package netutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/duke-git/lancet/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHttpClient_Get(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestHttpClient_Get")
|
||||||
|
|
||||||
|
request := &HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos/1",
|
||||||
|
Method: "GET",
|
||||||
|
}
|
||||||
|
|
||||||
|
httpClient := NewHttpClient()
|
||||||
|
resp, err := httpClient.SendRequest(request)
|
||||||
|
if err != nil || resp.StatusCode != 200 {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Todo struct {
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Id int `json:"id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Completed bool `json:"completed"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var todo Todo
|
||||||
|
httpClient.DecodeResponse(resp, &todo)
|
||||||
|
|
||||||
|
assert.Equal(1, todo.Id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHttpClent_Post(t *testing.T) {
|
||||||
|
header := http.Header{}
|
||||||
|
header.Add("Content-Type", "multipart/form-data")
|
||||||
|
|
||||||
|
postData := url.Values{}
|
||||||
|
postData.Add("userId", "1")
|
||||||
|
postData.Add("title", "testItem")
|
||||||
|
|
||||||
|
request := &HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos",
|
||||||
|
Method: "POST",
|
||||||
|
Headers: header,
|
||||||
|
FormData: postData,
|
||||||
|
}
|
||||||
|
|
||||||
|
httpClient := NewHttpClient()
|
||||||
|
resp, err := httpClient.SendRequest(request)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
t.Log("response: ", resp.StatusCode, string(body))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStructToUrlValues(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestStructToUrlValues")
|
||||||
|
|
||||||
|
type TodoQuery struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
}
|
||||||
|
todoQuery := TodoQuery{
|
||||||
|
Id: 1,
|
||||||
|
UserId: 1,
|
||||||
|
}
|
||||||
|
todoValues := StructToUrlValues(todoQuery)
|
||||||
|
|
||||||
|
assert.Equal("1", todoValues.Get("id"))
|
||||||
|
assert.Equal("1", todoValues.Get("userId"))
|
||||||
|
|
||||||
|
request := &HttpRequest{
|
||||||
|
RawURL: "https://jsonplaceholder.typicode.com/todos",
|
||||||
|
Method: "GET",
|
||||||
|
QueryParams: todoValues,
|
||||||
|
}
|
||||||
|
|
||||||
|
httpClient := NewHttpClient()
|
||||||
|
resp, err := httpClient.SendRequest(request)
|
||||||
|
if err != nil || resp.StatusCode != 200 {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
t.Log("response: ", string(body))
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
"net/url"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/duke-git/lancet/internal"
|
"github.com/duke-git/lancet/internal"
|
||||||
@@ -46,6 +47,29 @@ func TestHttpPost(t *testing.T) {
|
|||||||
t.Log("response: ", resp.StatusCode, string(body))
|
t.Log("response: ", resp.StatusCode, string(body))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHttpPostFormData(t *testing.T) {
|
||||||
|
apiUrl := "https://jsonplaceholder.typicode.com/todos"
|
||||||
|
header := map[string]string{
|
||||||
|
// "Content-Type": "application/x-www-form-urlencoded",
|
||||||
|
"Content-Type": "multipart/form-data",
|
||||||
|
}
|
||||||
|
type Todo struct {
|
||||||
|
UserId int `json:"userId"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
postData := url.Values{}
|
||||||
|
postData.Add("userId", "1")
|
||||||
|
postData.Add("title", "TestAddToDo")
|
||||||
|
|
||||||
|
resp, err := HttpPost(apiUrl, header, postData, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
body, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
t.Log("response: ", resp.StatusCode, string(body))
|
||||||
|
}
|
||||||
|
|
||||||
func TestHttpPut(t *testing.T) {
|
func TestHttpPut(t *testing.T) {
|
||||||
url := "https://jsonplaceholder.typicode.com/todos/1"
|
url := "https://jsonplaceholder.typicode.com/todos/1"
|
||||||
header := map[string]string{
|
header := map[string]string{
|
||||||
@@ -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
|
||||||
@@ -47,6 +49,66 @@ func GetPublicIpInfo() (*PublicIpInfo, error) {
|
|||||||
return &ip, nil
|
return &ip, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetIps return all ipv4 of system
|
||||||
|
func GetIps() []string {
|
||||||
|
var ips []string
|
||||||
|
|
||||||
|
addrs, err := net.InterfaceAddrs()
|
||||||
|
if err != nil {
|
||||||
|
return ips
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, addr := range addrs {
|
||||||
|
ipNet, isValid := addr.(*net.IPNet)
|
||||||
|
if isValid && !ipNet.IP.IsLoopback() {
|
||||||
|
if ipNet.IP.To4() != nil {
|
||||||
|
ips = append(ips, ipNet.IP.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ips
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMacAddrs get mac address
|
||||||
|
func GetMacAddrs() []string {
|
||||||
|
var macAddrs []string
|
||||||
|
|
||||||
|
nets, err := net.Interfaces()
|
||||||
|
if err != nil {
|
||||||
|
return macAddrs
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, net := range nets {
|
||||||
|
macAddr := net.HardwareAddr.String()
|
||||||
|
if len(macAddr) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
macAddrs = append(macAddrs, macAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return macAddrs
|
||||||
|
}
|
||||||
|
|
||||||
// PublicIpInfo public ip info: country, region, isp, city, lat, lon, ip
|
// PublicIpInfo public ip info: country, region, isp, city, lat, lon, ip
|
||||||
type PublicIpInfo struct {
|
type PublicIpInfo struct {
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
@@ -82,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
|
||||||
|
}
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ func doHttpRequest(method, reqUrl string, params ...interface{}) (*http.Response
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
case 3:
|
case 3:
|
||||||
|
|
||||||
err := setHeaderAndQueryAndBody(req, reqUrl, params[0], params[1], params[2])
|
err := setHeaderAndQueryAndBody(req, reqUrl, params[0], params[1], params[2])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -81,7 +82,21 @@ func setHeaderAndQueryAndBody(req *http.Request, reqUrl string, header, queryPar
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = setBodyByte(req, body)
|
if strings.Contains(req.Header.Get("Content-Type"), "multipart/form-data") || req.Header.Get("Content-Type") == "application/x-www-form-urlencoded" {
|
||||||
|
if formData, ok := queryParam.(url.Values); ok {
|
||||||
|
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 {
|
||||||
|
err = setBodyByte(req, body)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -157,16 +172,13 @@ func setQueryParam(req *http.Request, reqUrl string, queryParam interface{}) err
|
|||||||
|
|
||||||
func setBodyByte(req *http.Request, body interface{}) error {
|
func setBodyByte(req *http.Request, body interface{}) error {
|
||||||
if body != nil {
|
if body != nil {
|
||||||
var bodyByte []byte
|
switch b := body.(type) {
|
||||||
if body != nil {
|
case []byte:
|
||||||
switch v := body.(type) {
|
req.Body = ioutil.NopCloser(bytes.NewReader(b))
|
||||||
case []byte:
|
req.ContentLength = int64(len(b))
|
||||||
bodyByte = v
|
default:
|
||||||
default:
|
return errors.New("body type should be []byte")
|
||||||
return errors.New("body type should be []byte")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
req.Body = ioutil.NopCloser(bytes.NewReader(bodyByte))
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -42,3 +42,13 @@ func TestIsPublicIP(t *testing.T) {
|
|||||||
assert.Equal(expected[i], actual)
|
assert.Equal(expected[i], actual)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetIps(t *testing.T) {
|
||||||
|
ips := GetIps()
|
||||||
|
t.Log(ips)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetMacAddrs(t *testing.T) {
|
||||||
|
macAddrs := GetMacAddrs()
|
||||||
|
t.Log(macAddrs)
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,22 +6,21 @@ package random
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
crand "crypto/rand"
|
crand "crypto/rand"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RandString generate random string
|
const (
|
||||||
// see https://stackoverflow.com/questions/22892120/how-to-generate-a-random-string-of-a-fixed-length-in-go
|
NUMERAL = "0123456789"
|
||||||
func RandString(length int) string {
|
LOWER_LETTERS = "abcdefghijklmnopqrstuvwxyz"
|
||||||
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
UPPER_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
)
|
||||||
|
|
||||||
b := make([]byte, length)
|
func init() {
|
||||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
rand.Seed(time.Now().UnixNano())
|
||||||
for i := range b {
|
|
||||||
b[i] = letters[r.Int63()%int64(len(letters))]
|
|
||||||
}
|
|
||||||
return string(b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// RandInt generate random int between min and max, maybe min, not be max
|
// RandInt generate random int between min and max, maybe min, not be max
|
||||||
@@ -29,11 +28,12 @@ func RandInt(min, max int) int {
|
|||||||
if min == max {
|
if min == max {
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
|
|
||||||
if max < min {
|
if max < min {
|
||||||
min, max = max, min
|
min, max = max, min
|
||||||
}
|
}
|
||||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
||||||
return r.Intn(max-min) + min
|
return rand.Intn(max-min) + min
|
||||||
}
|
}
|
||||||
|
|
||||||
// RandBytes generate random byte slice
|
// RandBytes generate random byte slice
|
||||||
@@ -48,3 +48,56 @@ func RandBytes(length int) []byte {
|
|||||||
}
|
}
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RandString generate random string
|
||||||
|
func RandString(length int) string {
|
||||||
|
return random(LETTERS, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RandUpper generate a random upper case string
|
||||||
|
func RandUpper(length int) string {
|
||||||
|
return random(UPPER_LETTERS, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RandLower generate a random lower case string
|
||||||
|
func RandLower(length int) string {
|
||||||
|
return random(LOWER_LETTERS, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RandNumeral generate a random numeral string
|
||||||
|
func RandNumeral(length int) string {
|
||||||
|
return random(NUMERAL, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RandNumeralOrLetter generate a random numeral or letter string
|
||||||
|
func RandNumeralOrLetter(length int) string {
|
||||||
|
return random(NUMERAL+LETTERS, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
// random generate a random string based on given string range
|
||||||
|
func random(s string, length int) string {
|
||||||
|
b := make([]byte, length)
|
||||||
|
|
||||||
|
// fix: https://github.com/duke-git/lancet/issues/75
|
||||||
|
// r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
|
||||||
|
for i := range b {
|
||||||
|
b[i] = s[rand.Int63()%int64(len(s))]
|
||||||
|
}
|
||||||
|
return string(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UUIdV4 generate a random UUID of version 4 according to RFC 4122
|
||||||
|
func UUIdV4() (string, error) {
|
||||||
|
uuid := make([]byte, 16)
|
||||||
|
|
||||||
|
n, err := io.ReadFull(crand.Reader, uuid)
|
||||||
|
if n != len(uuid) || err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
uuid[8] = uuid[8]&^0xc0 | 0x80
|
||||||
|
uuid[6] = uuid[6]&^0xf0 | 0x40
|
||||||
|
|
||||||
|
return fmt.Sprintf("%x-%x-%x-%x-%x", uuid[0:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:]), nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,6 +19,51 @@ func TestRandString(t *testing.T) {
|
|||||||
assert.Equal(true, reg.MatchString(randStr))
|
assert.Equal(true, reg.MatchString(randStr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRandUpper(t *testing.T) {
|
||||||
|
pattern := `^[A-Z]+$`
|
||||||
|
reg := regexp.MustCompile(pattern)
|
||||||
|
|
||||||
|
randStr := RandUpper(6)
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestRandUpper")
|
||||||
|
assert.Equal(6, len(randStr))
|
||||||
|
assert.Equal(true, reg.MatchString(randStr))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRandLower(t *testing.T) {
|
||||||
|
pattern := `^[a-z]+$`
|
||||||
|
reg := regexp.MustCompile(pattern)
|
||||||
|
|
||||||
|
randStr := RandLower(6)
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestRandLower")
|
||||||
|
assert.Equal(6, len(randStr))
|
||||||
|
assert.Equal(true, reg.MatchString(randStr))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRandNumeral(t *testing.T) {
|
||||||
|
pattern := `^[0-9]+$`
|
||||||
|
reg := regexp.MustCompile(pattern)
|
||||||
|
|
||||||
|
randStr := RandNumeral(12)
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestRandNumeral")
|
||||||
|
assert.Equal(12, len(randStr))
|
||||||
|
assert.Equal(true, reg.MatchString(randStr))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRandNumeralOrLetter(t *testing.T) {
|
||||||
|
pattern := `^[0-9a-zA-Z]+$`
|
||||||
|
reg := regexp.MustCompile(pattern)
|
||||||
|
|
||||||
|
randStr := RandNumeralOrLetter(10)
|
||||||
|
t.Log(randStr)
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestRandNumeralOrLetter")
|
||||||
|
assert.Equal(10, len(randStr))
|
||||||
|
assert.Equal(true, reg.MatchString(randStr))
|
||||||
|
}
|
||||||
|
|
||||||
func TestRandInt(t *testing.T) {
|
func TestRandInt(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestRandInt")
|
assert := internal.NewAssert(t, "TestRandInt")
|
||||||
|
|
||||||
@@ -47,3 +92,16 @@ func TestRandBytes(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal([]byte{}, RandBytes(0))
|
assert.Equal([]byte{}, RandBytes(0))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUUIdV4(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestUUIdV4")
|
||||||
|
|
||||||
|
uuid, err := UUIdV4()
|
||||||
|
if err != nil {
|
||||||
|
t.Log(err)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
isUUiDV4 := regexp.MustCompile(`^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`)
|
||||||
|
assert.Equal(true, isUUiDV4.MatchString(uuid))
|
||||||
|
}
|
||||||
|
|||||||
240
slice/slice.go
240
slice/slice.go
@@ -167,15 +167,15 @@ func Difference(slice1, slice2 interface{}) interface{} {
|
|||||||
// 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,
|
||||||
// the iterateeFn function signature should be func(index int, value interface{}) interface{}.
|
// the iteratee function signature should be func(index int, value interface{}) interface{}.
|
||||||
func DifferenceBy(slice interface{}, comparedSlice interface{}, iterateeFn interface{}) interface{} {
|
func DifferenceBy(slice interface{}, comparedSlice interface{}, iteratee interface{}) interface{} {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
smv := sliceValue(comparedSlice)
|
smv := sliceValue(comparedSlice)
|
||||||
fn := functionValue(iterateeFn)
|
fn := functionValue(iteratee)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, nil) {
|
if checkSliceCallbackFuncSignature(fn, elemType, nil) {
|
||||||
panic("function param should be of type func(" + elemType.String() + ")" + elemType.String())
|
panic("iteratee function signature should be func(" + elemType.String() + ")" + elemType.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
slice1 := reflect.MakeSlice(sv.Type(), sv.Len(), sv.Len())
|
slice1 := reflect.MakeSlice(sv.Type(), sv.Len(), sv.Len())
|
||||||
@@ -203,15 +203,57 @@ func DifferenceBy(slice interface{}, comparedSlice interface{}, iterateeFn inter
|
|||||||
return res.Interface()
|
return res.Interface()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Equal checks if two slices are equal: the same length and all elements' order and value are equal
|
||||||
|
func Equal(slice1, slice2 interface{}) bool {
|
||||||
|
sv1 := sliceValue(slice1)
|
||||||
|
sv2 := sliceValue(slice2)
|
||||||
|
|
||||||
|
if sv1.Type().Elem() != sv2.Type().Elem() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if sv1.Len() != sv2.Len() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < sv1.Len(); i++ {
|
||||||
|
if sv1.Index(i).Interface() != sv2.Index(i).Interface() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// EqualWith checks if two slices are equal with comparator func
|
||||||
|
func EqualWith(slice1, slice2 interface{}, comparator interface{}) bool {
|
||||||
|
sv1 := sliceValue(slice1)
|
||||||
|
sv2 := sliceValue(slice2)
|
||||||
|
|
||||||
|
fn := functionValue(comparator)
|
||||||
|
// elemType1 := sv1.Type().Elem()
|
||||||
|
// elemType2 := sv2.Type().Elem()
|
||||||
|
// todo: check fn signature: func(a elemType1.Kind(), b elemType2.Kind()) bool
|
||||||
|
|
||||||
|
for i := 0; i < sv1.Len(); i++ {
|
||||||
|
flag := fn.Call([]reflect.Value{sv1.Index(i), sv2.Index(i)})[0]
|
||||||
|
if !flag.Bool() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// Every return true if all of the values in the slice pass the predicate function.
|
// Every return true if all of the values in the slice pass the predicate function.
|
||||||
// The function signature should be func(index int, value interface{}) bool .
|
// The iteratee function signature should be func(index int, value interface{}) bool .
|
||||||
func Every(slice, function interface{}) bool {
|
func Every(slice, function interface{}) bool {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(function)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
panic("iteratee function signature should be func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentLength int
|
var currentLength int
|
||||||
@@ -226,14 +268,14 @@ func Every(slice, function interface{}) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// None return true if all the values in the slice mismatch the criteria
|
// None return true if all the values in the slice mismatch the criteria
|
||||||
// The function signature should be func(index int, value interface{}) bool .
|
// The iteratee function signature should be func(index int, value interface{}) bool .
|
||||||
func None(slice, function interface{}) bool {
|
func None(slice, iteratee interface{}) bool {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(iteratee)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
panic("iteratee function signature should be func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentLength int
|
var currentLength int
|
||||||
@@ -248,14 +290,14 @@ func None(slice, function interface{}) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Some return true if any of the values in the list pass the predicate function.
|
// Some return true if any of the values in the list pass the predicate function.
|
||||||
// The function signature should be func(index int, value interface{}) bool .
|
// The iteratee function signature should be func(index int, value interface{}) bool .
|
||||||
func Some(slice, function interface{}) bool {
|
func Some(slice, iteratee interface{}) bool {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(iteratee)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
panic("iteratee function signature should be func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
has := false
|
has := false
|
||||||
@@ -270,14 +312,14 @@ func Some(slice, function interface{}) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Filter iterates over elements of slice, returning an slice of all elements `signature` returns truthy for.
|
// Filter iterates over elements of slice, returning an slice of all elements `signature` returns truthy for.
|
||||||
// The function signature should be func(index int, value interface{}) bool .
|
// The iteratee function signature should be func(index int, value interface{}) bool .
|
||||||
func Filter(slice, function interface{}) interface{} {
|
func Filter(slice, iteratee interface{}) interface{} {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(iteratee)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
panic("iteratee function signature should be func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
res := reflect.MakeSlice(sv.Type(), 0, 0)
|
res := reflect.MakeSlice(sv.Type(), 0, 0)
|
||||||
@@ -292,14 +334,14 @@ func Filter(slice, function interface{}) interface{} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
||||||
// The function signature should be func(index int, value interface{}) bool .
|
// The iteratee function signature should be func(index int, value interface{}) bool .
|
||||||
func Count(slice, function interface{}) int {
|
func Count(slice, iteratee interface{}) int {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(iteratee)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
panic("iteratee function signature should be func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
var counter int
|
var counter int
|
||||||
@@ -314,14 +356,14 @@ func Count(slice, function interface{}) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GroupBy iterate over elements of the slice, each element will be group by criteria, returns two slices
|
// GroupBy iterate over elements of the slice, each element will be group by criteria, returns two slices
|
||||||
// The function signature should be func(index int, value interface{}) bool .
|
// The iteratee function signature should be func(index int, value interface{}) bool .
|
||||||
func GroupBy(slice, function interface{}) (interface{}, interface{}) {
|
func GroupBy(slice, iteratee interface{}) (interface{}, interface{}) {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(iteratee)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
panic("iteratee function signature should be func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
groupB := reflect.MakeSlice(sv.Type(), 0, 0)
|
groupB := reflect.MakeSlice(sv.Type(), 0, 0)
|
||||||
@@ -340,14 +382,14 @@ func GroupBy(slice, function interface{}) (interface{}, interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find iterates over elements of slice, returning the first one that passes a truth test on function.
|
// Find iterates over elements of slice, returning the first one that passes a truth test on function.
|
||||||
// The function signature should be func(index int, value interface{}) bool .
|
// The predicate function signature should be func(index int, value interface{}) bool .
|
||||||
func Find(slice, function interface{}) (interface{}, bool) {
|
func Find(slice, predicate interface{}) (interface{}, bool) {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(predicate)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
panic("predicate function signature should be func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
index := -1
|
index := -1
|
||||||
@@ -367,6 +409,34 @@ func Find(slice, function interface{}) (interface{}, bool) {
|
|||||||
return sv.Index(index).Interface(), true
|
return sv.Index(index).Interface(), true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FindLast iterates over elements of slice from end to begin, returning the first one that passes a truth test on function.
|
||||||
|
// The function signature should be func(index int, value interface{}) bool .
|
||||||
|
func FindLast(slice, predicate interface{}) (interface{}, bool) {
|
||||||
|
sv := sliceValue(slice)
|
||||||
|
fn := functionValue(predicate)
|
||||||
|
|
||||||
|
elemType := sv.Type().Elem()
|
||||||
|
if checkSliceCallbackFuncSignature(fn, elemType, reflect.ValueOf(true).Type()) {
|
||||||
|
panic("predicate function signature should be func(int, " + elemType.String() + ")" + reflect.ValueOf(true).Type().String())
|
||||||
|
}
|
||||||
|
|
||||||
|
index := -1
|
||||||
|
for i := sv.Len() - 1; i >= 0; i-- {
|
||||||
|
flag := fn.Call([]reflect.Value{reflect.ValueOf(i), sv.Index(i)})[0]
|
||||||
|
if flag.Bool() {
|
||||||
|
index = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if index == -1 {
|
||||||
|
var none interface{}
|
||||||
|
return none, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return sv.Index(index).Interface(), true
|
||||||
|
}
|
||||||
|
|
||||||
// FlattenDeep flattens slice recursive
|
// FlattenDeep flattens slice recursive
|
||||||
func FlattenDeep(slice interface{}) interface{} {
|
func FlattenDeep(slice interface{}) interface{} {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
@@ -392,14 +462,14 @@ func flattenRecursive(value reflect.Value, result reflect.Value) reflect.Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ForEach iterates over elements of slice and invokes function for each element
|
// ForEach iterates over elements of slice and invokes function for each element
|
||||||
// The function signature should be func(index int, value interface{}).
|
// The iteratee function signature should be func(index int, value interface{}).
|
||||||
func ForEach(slice, function interface{}) {
|
func ForEach(slice, iteratee interface{}) {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(iteratee)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, nil) {
|
if checkSliceCallbackFuncSignature(fn, elemType, nil) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + elemType.String())
|
panic("iteratee function signature should be func(int, " + elemType.String() + ")" + elemType.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < sv.Len(); i++ {
|
for i := 0; i < sv.Len(); i++ {
|
||||||
@@ -408,14 +478,14 @@ func ForEach(slice, function interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Map creates an slice of values by running each element of `slice` thru `function`.
|
// Map creates an slice of values by running each element of `slice` thru `function`.
|
||||||
// The function signature should be func(index int, value interface{}) interface{}.
|
// The iteratee function signature should be func(index int, value interface{}) interface{}.
|
||||||
func Map(slice, function interface{}) interface{} {
|
func Map(slice, iteratee interface{}) interface{} {
|
||||||
sv := sliceValue(slice)
|
sv := sliceValue(slice)
|
||||||
fn := functionValue(function)
|
fn := functionValue(iteratee)
|
||||||
|
|
||||||
elemType := sv.Type().Elem()
|
elemType := sv.Type().Elem()
|
||||||
if checkSliceCallbackFuncSignature(fn, elemType, nil) {
|
if checkSliceCallbackFuncSignature(fn, elemType, nil) {
|
||||||
panic("function param should be of type func(int, " + elemType.String() + ")" + elemType.String())
|
panic("iteratee function signature should be func(int, " + elemType.String() + ")" + elemType.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
res := reflect.MakeSlice(sv.Type(), sv.Len(), sv.Len())
|
res := reflect.MakeSlice(sv.Type(), sv.Len(), sv.Len())
|
||||||
@@ -571,7 +641,6 @@ func InsertByIndex(slice interface{}, index int, value interface{}) (interface{}
|
|||||||
return slice, errors.New("InvalidSliceIndex")
|
return slice, errors.New("InvalidSliceIndex")
|
||||||
}
|
}
|
||||||
|
|
||||||
// value is slice
|
|
||||||
vv := reflect.ValueOf(value)
|
vv := reflect.ValueOf(value)
|
||||||
if vv.Kind() == reflect.Slice {
|
if vv.Kind() == reflect.Slice {
|
||||||
if reflect.TypeOf(slice).Elem() != reflect.TypeOf(value).Elem() {
|
if reflect.TypeOf(slice).Elem() != reflect.TypeOf(value).Elem() {
|
||||||
@@ -581,7 +650,6 @@ func InsertByIndex(slice interface{}, index int, value interface{}) (interface{}
|
|||||||
return v.Interface(), nil
|
return v.Interface(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// value is not slice
|
|
||||||
if reflect.TypeOf(slice).Elem() != reflect.TypeOf(value) {
|
if reflect.TypeOf(slice).Elem() != reflect.TypeOf(value) {
|
||||||
return slice, errors.New("InvalidValueType")
|
return slice, errors.New("InvalidValueType")
|
||||||
}
|
}
|
||||||
@@ -639,21 +707,28 @@ func Unique(slice interface{}) interface{} {
|
|||||||
for i := 0; i < len(temp); i++ {
|
for i := 0; i < len(temp); i++ {
|
||||||
res.Index(i).Set(reflect.ValueOf(temp[i]))
|
res.Index(i).Set(reflect.ValueOf(temp[i]))
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.Interface()
|
return res.Interface()
|
||||||
|
}
|
||||||
|
|
||||||
// if use map filter, the result slice element order is random, not same as origin slice
|
// UniqueBy call iteratee func with every item of slice, then remove duplicated.
|
||||||
//mp := make(map[interface{}]bool)
|
// The iteratee function signature should be func(value interface{}) interface{}.
|
||||||
//for i := 0; i < sv.Len(); i++ {
|
func UniqueBy(slice, iteratee interface{}) interface{} {
|
||||||
// v := sv.Index(i).Interface()
|
sv := sliceValue(slice)
|
||||||
// mp[v] = true
|
fn := functionValue(iteratee)
|
||||||
//}
|
|
||||||
//
|
|
||||||
//var res []interface{}
|
|
||||||
//for k := range mp {
|
|
||||||
// res = append(res, mp[k])
|
|
||||||
//}
|
|
||||||
//return res
|
|
||||||
|
|
||||||
|
if sv.Len() == 0 {
|
||||||
|
return slice
|
||||||
|
}
|
||||||
|
|
||||||
|
res := reflect.MakeSlice(sv.Type(), sv.Len(), sv.Len())
|
||||||
|
|
||||||
|
for i := 0; i < sv.Len(); i++ {
|
||||||
|
val := fn.Call([]reflect.Value{sv.Index(i)})[0]
|
||||||
|
res.Index(i).Set(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
return Unique(res.Interface())
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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.
|
||||||
@@ -832,3 +907,64 @@ func Without(slice interface{}, values ...interface{}) interface{} {
|
|||||||
|
|
||||||
return res.Interface()
|
return res.Interface()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
func IndexOf(slice, value interface{}) int {
|
||||||
|
sv := sliceValue(slice)
|
||||||
|
|
||||||
|
for i := 0; i < sv.Len(); i++ {
|
||||||
|
if reflect.DeepEqual(sv.Index(i).Interface(), value) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
|
func LastIndexOf(slice, value interface{}) int {
|
||||||
|
sv := sliceValue(slice)
|
||||||
|
|
||||||
|
for i := sv.Len() - 1; i > 0; i-- {
|
||||||
|
if reflect.DeepEqual(sv.Index(i).Interface(), value) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSlicePointer returns a pointer to the slices of a variable parameter transformation
|
||||||
|
func ToSlicePointer(value ...interface{}) []*interface{} {
|
||||||
|
out := make([]*interface{}, len(value))
|
||||||
|
for i := range value {
|
||||||
|
out[i] = &value[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToSlice returns a slices of a variable parameter transformation
|
||||||
|
func ToSlice(value ...interface{}) interface{} {
|
||||||
|
rv := reflect.ValueOf(value)
|
||||||
|
out := reflect.MakeSlice(rv.Type(), len(value), len(value))
|
||||||
|
for i := range value {
|
||||||
|
out.Index(i).Set(reflect.ValueOf(value[i]))
|
||||||
|
}
|
||||||
|
return out.Interface()
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendIfAbsent only absent append the value
|
||||||
|
func AppendIfAbsent(slice interface{}, value interface{}) interface{} {
|
||||||
|
sv := sliceValue(slice)
|
||||||
|
out := reflect.MakeSlice(sv.Type(), sv.Len(), sv.Len())
|
||||||
|
for i := 0; i < sv.Len(); i++ {
|
||||||
|
out.Index(i).Set(sv.Index(i))
|
||||||
|
}
|
||||||
|
if !Contain(slice, value) {
|
||||||
|
out = reflect.Append(out, reflect.ValueOf(value))
|
||||||
|
}
|
||||||
|
return out.Interface()
|
||||||
|
}
|
||||||
|
|||||||
@@ -73,6 +73,30 @@ func TestConcat(t *testing.T) {
|
|||||||
assert.Equal([]int{1, 2, 3, 4, 5}, Concat([]int{1, 2, 3}, []int{4}, 5))
|
assert.Equal([]int{1, 2, 3, 4, 5}, Concat([]int{1, 2, 3}, []int{4}, 5))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEqual(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEqual")
|
||||||
|
|
||||||
|
slice1 := []int{1, 2, 3}
|
||||||
|
slice2 := []int{1, 2, 3}
|
||||||
|
slice3 := []int{3, 2, 1}
|
||||||
|
|
||||||
|
assert.Equal(true, Equal(slice1, slice2))
|
||||||
|
assert.Equal(false, Equal(slice1, slice3))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEqualWith(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestEqualWith")
|
||||||
|
|
||||||
|
slice1 := []int{1, 2, 3}
|
||||||
|
slice2 := []int{2, 4, 6}
|
||||||
|
|
||||||
|
isDouble := func(a, b int) bool {
|
||||||
|
return b == a*2
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(true, EqualWith(slice1, slice2, isDouble))
|
||||||
|
}
|
||||||
|
|
||||||
func TestEvery(t *testing.T) {
|
func TestEvery(t *testing.T) {
|
||||||
nums := []int{1, 2, 3, 5}
|
nums := []int{1, 2, 3, 5}
|
||||||
isEven := func(i, num int) bool {
|
isEven := func(i, num int) bool {
|
||||||
@@ -172,6 +196,20 @@ func TestFind(t *testing.T) {
|
|||||||
assert.Equal(2, res)
|
assert.Equal(2, res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFindLast(t *testing.T) {
|
||||||
|
nums := []int{1, 2, 3, 4, 5}
|
||||||
|
even := func(i, num int) bool {
|
||||||
|
return num%2 == 0
|
||||||
|
}
|
||||||
|
res, ok := FindLast(nums, even)
|
||||||
|
if !ok {
|
||||||
|
t.Fatal("found nothing")
|
||||||
|
}
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestFindLast")
|
||||||
|
assert.Equal(4, res)
|
||||||
|
}
|
||||||
|
|
||||||
func TestFindFoundNothing(t *testing.T) {
|
func TestFindFoundNothing(t *testing.T) {
|
||||||
nums := []int{1, 1, 1, 1, 1, 1}
|
nums := []int{1, 1, 1, 1, 1, 1}
|
||||||
findFunc := func(i, num int) bool {
|
findFunc := func(i, num int) bool {
|
||||||
@@ -380,6 +418,15 @@ func TestUnique(t *testing.T) {
|
|||||||
assert.Equal([]string{"a", "b", "c"}, Unique([]string{"a", "a", "b", "c"}))
|
assert.Equal([]string{"a", "b", "c"}, Unique([]string{"a", "a", "b", "c"}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUniqueBy(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestUniqueBy")
|
||||||
|
|
||||||
|
actual := UniqueBy([]int{1, 2, 3, 4, 5, 6}, func(val int) int {
|
||||||
|
return val % 4
|
||||||
|
})
|
||||||
|
assert.Equal([]int{1, 2, 3, 0}, actual)
|
||||||
|
}
|
||||||
|
|
||||||
func TestUnion(t *testing.T) {
|
func TestUnion(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestUnion")
|
assert := internal.NewAssert(t, "TestUnion")
|
||||||
|
|
||||||
@@ -432,7 +479,7 @@ func TestReverseSlice(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestDifference(t *testing.T) {
|
func TestDifference(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestIntersection")
|
assert := internal.NewAssert(t, "TestDifference")
|
||||||
|
|
||||||
s1 := []int{1, 2, 3, 4, 5}
|
s1 := []int{1, 2, 3, 4, 5}
|
||||||
s2 := []int{4, 5, 6}
|
s2 := []int{4, 5, 6}
|
||||||
@@ -443,7 +490,7 @@ func TestDifferenceBy(t *testing.T) {
|
|||||||
assert := internal.NewAssert(t, "TestDifferenceBy")
|
assert := internal.NewAssert(t, "TestDifferenceBy")
|
||||||
|
|
||||||
s1 := []int{1, 2, 3, 4, 5} //after add one: 2 3 4 5 6
|
s1 := []int{1, 2, 3, 4, 5} //after add one: 2 3 4 5 6
|
||||||
s2 := []int{3, 4, 5} //after add one: 4 5 6
|
s2 := []int{3, 4, 5} //after add one: 4 5 6
|
||||||
addOne := func(i int, v int) int {
|
addOne := func(i int, v int) int {
|
||||||
return v + 1
|
return v + 1
|
||||||
}
|
}
|
||||||
@@ -451,7 +498,7 @@ func TestDifferenceBy(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSortByFielDesc(t *testing.T) {
|
func TestSortByFielDesc(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestWithout")
|
assert := internal.NewAssert(t, "TestSortByFielDesc")
|
||||||
|
|
||||||
type student struct {
|
type student struct {
|
||||||
name string
|
name string
|
||||||
@@ -477,7 +524,7 @@ func TestSortByFielDesc(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSortByFieldAsc(t *testing.T) {
|
func TestSortByFieldAsc(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestSortByField")
|
assert := internal.NewAssert(t, "TestSortByFieldAsc")
|
||||||
|
|
||||||
type student struct {
|
type student struct {
|
||||||
name string
|
name string
|
||||||
@@ -529,3 +576,51 @@ func TestShuffle(t *testing.T) {
|
|||||||
assert.Equal(true, Contain(res, 4))
|
assert.Equal(true, Contain(res, 4))
|
||||||
assert.Equal(true, Contain(res, 5))
|
assert.Equal(true, Contain(res, 5))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIndexOf(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestIndexOf")
|
||||||
|
|
||||||
|
arr := []string{"a", "a", "b", "c"}
|
||||||
|
assert.Equal(0, IndexOf(arr, "a"))
|
||||||
|
assert.Equal(-1, IndexOf(arr, "d"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLastIndexOf(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestLastIndexOf")
|
||||||
|
|
||||||
|
arr := []string{"a", "a", "b", "c"}
|
||||||
|
assert.Equal(1, LastIndexOf(arr, "a"))
|
||||||
|
assert.Equal(-1, LastIndexOf(arr, "d"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestToSlice(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToSlice")
|
||||||
|
|
||||||
|
str1 := "a"
|
||||||
|
str2 := "b"
|
||||||
|
out1 := ToSlice(str1)
|
||||||
|
out2 := ToSlice(str1, str2)
|
||||||
|
|
||||||
|
assert.Equal([]string{"a"}, StringSlice(out1))
|
||||||
|
assert.Equal([]string{"a", "b"}, StringSlice(out2))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestToSlicePointer(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToSlicePointer")
|
||||||
|
|
||||||
|
var str1 interface{}
|
||||||
|
str1 = "a"
|
||||||
|
var str2 interface{}
|
||||||
|
str2 = "b"
|
||||||
|
|
||||||
|
assert.Equal([]*interface{}{&str1}, ToSlicePointer(str1))
|
||||||
|
assert.Equal([]*interface{}{&str1, &str2}, ToSlicePointer(str1, str2))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppendIfAbsent(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestToAppendIfAbsent")
|
||||||
|
|
||||||
|
str1 := []string{"a", "b"}
|
||||||
|
assert.Equal([]string{"a", "b"}, AppendIfAbsent(str1, "a"))
|
||||||
|
assert.Equal([]string{"a", "b", "c"}, AppendIfAbsent(str1, "c"))
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,53 +5,41 @@
|
|||||||
package strutil
|
package strutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"regexp"
|
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CamelCase covert string to camelCase string.
|
// CamelCase covert string to camelCase string.
|
||||||
|
// non letters and numbers will be ignored
|
||||||
|
// eg. "Foo-#1😄$_%^&*(1bar" => "foo11Bar"
|
||||||
func CamelCase(s string) string {
|
func CamelCase(s string) string {
|
||||||
if len(s) == 0 {
|
var builder strings.Builder
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
res := ""
|
strs := splitIntoStrings(s, false)
|
||||||
blankSpace := " "
|
for i, str := range strs {
|
||||||
regex, _ := regexp.Compile("[-_&]+")
|
|
||||||
ss := regex.ReplaceAllString(s, blankSpace)
|
|
||||||
for i, v := range strings.Split(ss, blankSpace) {
|
|
||||||
vv := []rune(v)
|
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
if vv[i] >= 65 && vv[i] <= 96 {
|
builder.WriteString(strings.ToLower(str))
|
||||||
vv[0] += 32
|
|
||||||
}
|
|
||||||
res += string(vv)
|
|
||||||
} else {
|
} else {
|
||||||
res += Capitalize(v)
|
builder.WriteString(Capitalize(str))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return builder.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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.
|
||||||
func Capitalize(s string) string {
|
func Capitalize(s string) string {
|
||||||
if len(s) == 0 {
|
result := make([]rune, len(s))
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
out := make([]rune, len(s))
|
|
||||||
for i, v := range s {
|
for i, v := range s {
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
out[i] = unicode.ToUpper(v)
|
result[i] = unicode.ToUpper(v)
|
||||||
} else {
|
} else {
|
||||||
out[i] = unicode.ToLower(v)
|
result[i] = unicode.ToLower(v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return string(out)
|
return string(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpperFirst converts the first character of string to upper case.
|
// UpperFirst converts the first character of string to upper case.
|
||||||
@@ -78,86 +66,54 @@ func LowerFirst(s string) string {
|
|||||||
return string(r) + s[size:]
|
return string(r) + s[size:]
|
||||||
}
|
}
|
||||||
|
|
||||||
// PadEnd pads string on the right side if it's shorter than size.
|
// PadStart pads string on the left and right side if it's shorter than size.
|
||||||
// Padding characters are truncated if they exceed size.
|
// Padding characters are truncated if they exceed size.
|
||||||
func PadEnd(source string, size int, padStr string) string {
|
func Pad(source string, size int, padStr string) string {
|
||||||
len1 := len(source)
|
return padAtPosition(source, size, padStr, 0)
|
||||||
len2 := len(padStr)
|
|
||||||
|
|
||||||
if len1 >= size {
|
|
||||||
return source
|
|
||||||
}
|
|
||||||
|
|
||||||
fill := ""
|
|
||||||
if len2 >= size-len1 {
|
|
||||||
fill = padStr[0 : size-len1]
|
|
||||||
} else {
|
|
||||||
fill = strings.Repeat(padStr, size-len1)
|
|
||||||
}
|
|
||||||
return source + fill[0:size-len1]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PadStart pads string on the left side if it's shorter than size.
|
// PadStart pads string on the left side if it's shorter than size.
|
||||||
// Padding characters are truncated if they exceed size.
|
// Padding characters are truncated if they exceed size.
|
||||||
func PadStart(source string, size int, padStr string) string {
|
func PadStart(source string, size int, padStr string) string {
|
||||||
len1 := len(source)
|
return padAtPosition(source, size, padStr, 1)
|
||||||
len2 := len(padStr)
|
}
|
||||||
|
|
||||||
if len1 >= size {
|
// PadEnd pads string on the right side if it's shorter than size.
|
||||||
return source
|
// Padding characters are truncated if they exceed size.
|
||||||
}
|
func PadEnd(source string, size int, padStr string) string {
|
||||||
|
return padAtPosition(source, size, padStr, 2)
|
||||||
fill := ""
|
|
||||||
if len2 >= size-len1 {
|
|
||||||
fill = padStr[0 : size-len1]
|
|
||||||
} else {
|
|
||||||
fill = strings.Repeat(padStr, size-len1)
|
|
||||||
}
|
|
||||||
return fill[0:size-len1] + source
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// KebabCase covert string to kebab-case
|
// KebabCase covert string to kebab-case
|
||||||
|
// non letters and numbers will be ignored
|
||||||
|
// eg. "Foo-#1😄$_%^&*(1bar" => "foo-1-1-bar"
|
||||||
func KebabCase(s string) string {
|
func KebabCase(s string) string {
|
||||||
if len(s) == 0 {
|
result := splitIntoStrings(s, false)
|
||||||
return ""
|
return strings.Join(result, "-")
|
||||||
}
|
}
|
||||||
|
|
||||||
regex := regexp.MustCompile(`[\W|_]+`)
|
// UpperKebabCase covert string to upper KEBAB-CASE
|
||||||
blankSpace := " "
|
// non letters and numbers will be ignored
|
||||||
match := regex.ReplaceAllString(s, blankSpace)
|
// eg. "Foo-#1😄$_%^&*(1bar" => "FOO-1-1-BAR"
|
||||||
rs := strings.Split(match, blankSpace)
|
func UpperKebabCase(s string) string {
|
||||||
|
result := splitIntoStrings(s, true)
|
||||||
var res []string
|
return strings.Join(result, "-")
|
||||||
for _, v := range rs {
|
|
||||||
splitWords := splitWordsToLower(v)
|
|
||||||
if len(splitWords) > 0 {
|
|
||||||
res = append(res, splitWords...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.Join(res, "-")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SnakeCase covert string to snake_case
|
// SnakeCase covert string to snake_case
|
||||||
|
// non letters and numbers will be ignored
|
||||||
|
// eg. "Foo-#1😄$_%^&*(1bar" => "foo_1_1_bar"
|
||||||
func SnakeCase(s string) string {
|
func SnakeCase(s string) string {
|
||||||
if len(s) == 0 {
|
result := splitIntoStrings(s, false)
|
||||||
return ""
|
return strings.Join(result, "_")
|
||||||
}
|
}
|
||||||
|
|
||||||
regex := regexp.MustCompile(`[\W|_]+`)
|
// UpperSnakeCase covert string to upper SNAKE_CASE
|
||||||
blankSpace := " "
|
// non letters and numbers will be ignored
|
||||||
match := regex.ReplaceAllString(s, blankSpace)
|
// eg. "Foo-#1😄$_%^&*(1bar" => "FOO_1_1_BAR"
|
||||||
rs := strings.Split(match, blankSpace)
|
func UpperSnakeCase(s string) string {
|
||||||
|
result := splitIntoStrings(s, true)
|
||||||
var res []string
|
return strings.Join(result, "_")
|
||||||
for _, v := range rs {
|
|
||||||
splitWords := splitWordsToLower(v)
|
|
||||||
if len(splitWords) > 0 {
|
|
||||||
res = append(res, splitWords...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.Join(res, "_")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Before create substring in source string before position when char first appear
|
// Before create substring in source string before position when char first appear
|
||||||
@@ -209,8 +165,8 @@ func IsString(v interface{}) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReverseStr return string whose char order is reversed to the given string
|
// Reverse return string whose char order is reversed to the given string
|
||||||
func ReverseStr(s string) string {
|
func Reverse(s string) string {
|
||||||
r := []rune(s)
|
r := []rune(s)
|
||||||
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
|
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
|
||||||
r[i], r[j] = r[j], r[i]
|
r[i], r[j] = r[j], r[i]
|
||||||
@@ -248,3 +204,123 @@ func Unwrap(str string, wrapToken string) string {
|
|||||||
|
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SplitEx split a given string whether the result contains empty string
|
||||||
|
func SplitEx(s, sep string, removeEmptyString bool) []string {
|
||||||
|
if sep == "" {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
n := strings.Count(s, sep) + 1
|
||||||
|
a := make([]string, n)
|
||||||
|
n--
|
||||||
|
i := 0
|
||||||
|
sepSave := 0
|
||||||
|
ignore := false
|
||||||
|
|
||||||
|
for i < n {
|
||||||
|
m := strings.Index(s, sep)
|
||||||
|
if m < 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
ignore = false
|
||||||
|
if removeEmptyString {
|
||||||
|
if s[:m+sepSave] == "" {
|
||||||
|
ignore = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !ignore {
|
||||||
|
a[i] = s[:m+sepSave]
|
||||||
|
s = s[m+len(sep):]
|
||||||
|
i++
|
||||||
|
} else {
|
||||||
|
s = s[m+len(sep):]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var ret []string
|
||||||
|
if removeEmptyString {
|
||||||
|
if s != "" {
|
||||||
|
a[i] = s
|
||||||
|
ret = a[:i+1]
|
||||||
|
} else {
|
||||||
|
ret = a[:i]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
a[i] = s
|
||||||
|
ret = a[:i+1]
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// SplitWords splits a string into words, word only contains alphabetic characters.
|
||||||
|
func SplitWords(s string) []string {
|
||||||
|
var word string
|
||||||
|
var words []string
|
||||||
|
var r rune
|
||||||
|
var size, pos int
|
||||||
|
|
||||||
|
isWord := false
|
||||||
|
|
||||||
|
for len(s) > 0 {
|
||||||
|
r, size = utf8.DecodeRuneInString(s)
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case isLetter(r):
|
||||||
|
if !isWord {
|
||||||
|
isWord = true
|
||||||
|
word = s
|
||||||
|
pos = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
case isWord && (r == '\'' || r == '-'):
|
||||||
|
// is word
|
||||||
|
|
||||||
|
default:
|
||||||
|
if isWord {
|
||||||
|
isWord = false
|
||||||
|
words = append(words, word[:pos])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += size
|
||||||
|
s = s[size:]
|
||||||
|
}
|
||||||
|
|
||||||
|
if isWord {
|
||||||
|
words = append(words, word[:pos])
|
||||||
|
}
|
||||||
|
|
||||||
|
return words
|
||||||
|
}
|
||||||
|
|
||||||
|
// WordCount return the number of meaningful word, word only contains alphabetic characters.
|
||||||
|
func WordCount(s string) int {
|
||||||
|
var r rune
|
||||||
|
var size, count int
|
||||||
|
|
||||||
|
isWord := false
|
||||||
|
|
||||||
|
for len(s) > 0 {
|
||||||
|
r, size = utf8.DecodeRuneInString(s)
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case isLetter(r):
|
||||||
|
if !isWord {
|
||||||
|
isWord = true
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
case isWord && (r == '\'' || r == '-'):
|
||||||
|
// is word
|
||||||
|
|
||||||
|
default:
|
||||||
|
isWord = false
|
||||||
|
}
|
||||||
|
|
||||||
|
s = s[size:]
|
||||||
|
}
|
||||||
|
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|||||||
167
strutil/string_internal.go
Normal file
167
strutil/string_internal.go
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
package strutil
|
||||||
|
|
||||||
|
import "unicode"
|
||||||
|
|
||||||
|
func splitIntoStrings(s string, upperCase bool) []string {
|
||||||
|
var runes [][]rune
|
||||||
|
lastCharType := 0
|
||||||
|
charType := 0
|
||||||
|
|
||||||
|
// split into fields based on type of unicode character
|
||||||
|
for _, r := range s {
|
||||||
|
switch true {
|
||||||
|
case isLower(r):
|
||||||
|
charType = 1
|
||||||
|
case isUpper(r):
|
||||||
|
charType = 2
|
||||||
|
case isDigit(r):
|
||||||
|
charType = 3
|
||||||
|
default:
|
||||||
|
charType = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
if charType == lastCharType {
|
||||||
|
runes[len(runes)-1] = append(runes[len(runes)-1], r)
|
||||||
|
} else {
|
||||||
|
runes = append(runes, []rune{r})
|
||||||
|
}
|
||||||
|
lastCharType = charType
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(runes)-1; i++ {
|
||||||
|
if isUpper(runes[i][0]) && isLower(runes[i+1][0]) {
|
||||||
|
runes[i+1] = append([]rune{runes[i][len(runes[i])-1]}, runes[i+1]...)
|
||||||
|
runes[i] = runes[i][:len(runes[i])-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// filter all none letters and none digit
|
||||||
|
var result []string
|
||||||
|
for _, rs := range runes {
|
||||||
|
if len(rs) > 0 && (unicode.IsLetter(rs[0]) || isDigit(rs[0])) {
|
||||||
|
if upperCase {
|
||||||
|
result = append(result, string(toUpperAll(rs)))
|
||||||
|
} else {
|
||||||
|
result = append(result, string(toLowerAll(rs)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// isDigit checks if a character is digit ('0' to '9')
|
||||||
|
func isDigit(r rune) bool {
|
||||||
|
return r >= '0' && r <= '9'
|
||||||
|
}
|
||||||
|
|
||||||
|
// isLower checks if a character is lower case ('a' to 'z')
|
||||||
|
func isLower(r rune) bool {
|
||||||
|
return r >= 'a' && r <= 'z'
|
||||||
|
}
|
||||||
|
|
||||||
|
// isUpper checks if a character is upper case ('A' to 'Z')
|
||||||
|
func isUpper(r rune) bool {
|
||||||
|
return r >= 'A' && r <= 'Z'
|
||||||
|
}
|
||||||
|
|
||||||
|
// toLower converts a character 'A' to 'Z' to its lower case
|
||||||
|
func toLower(r rune) rune {
|
||||||
|
if r >= 'A' && r <= 'Z' {
|
||||||
|
return r + 32
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// toLowerAll converts a character 'A' to 'Z' to its lower case
|
||||||
|
func toLowerAll(rs []rune) []rune {
|
||||||
|
for i := range rs {
|
||||||
|
rs[i] = toLower(rs[i])
|
||||||
|
}
|
||||||
|
return rs
|
||||||
|
}
|
||||||
|
|
||||||
|
// toUpper converts a character 'a' to 'z' to its upper case
|
||||||
|
func toUpper(r rune) rune {
|
||||||
|
if r >= 'a' && r <= 'z' {
|
||||||
|
return r - 32
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// toUpperAll converts a character 'a' to 'z' to its upper case
|
||||||
|
func toUpperAll(rs []rune) []rune {
|
||||||
|
for i := range rs {
|
||||||
|
rs[i] = toUpper(rs[i])
|
||||||
|
}
|
||||||
|
return rs
|
||||||
|
}
|
||||||
|
|
||||||
|
func padAtPosition(str string, length int, padStr string, position int) string {
|
||||||
|
if len(str) >= length {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
if padStr == "" {
|
||||||
|
padStr = " "
|
||||||
|
}
|
||||||
|
|
||||||
|
length = length - len(str)
|
||||||
|
startPadLen := 0
|
||||||
|
if position == 0 {
|
||||||
|
startPadLen = length / 2
|
||||||
|
} else if position == 1 {
|
||||||
|
startPadLen = length
|
||||||
|
}
|
||||||
|
endPadLen := length - startPadLen
|
||||||
|
|
||||||
|
charLen := len(padStr)
|
||||||
|
leftPad := ""
|
||||||
|
cur := 0
|
||||||
|
for cur < startPadLen {
|
||||||
|
leftPad += string(padStr[cur%charLen])
|
||||||
|
cur++
|
||||||
|
}
|
||||||
|
|
||||||
|
cur = 0
|
||||||
|
rightPad := ""
|
||||||
|
for cur < endPadLen {
|
||||||
|
rightPad += string(padStr[cur%charLen])
|
||||||
|
cur++
|
||||||
|
}
|
||||||
|
|
||||||
|
return leftPad + str + rightPad
|
||||||
|
}
|
||||||
|
|
||||||
|
// isLetter checks r is a letter but not CJK character.
|
||||||
|
func isLetter(r rune) bool {
|
||||||
|
if !unicode.IsLetter(r) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
// cjk char: /[\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff66-\uff9f]/
|
||||||
|
|
||||||
|
// hiragana and katakana (Japanese only)
|
||||||
|
case r >= '\u3034' && r < '\u30ff':
|
||||||
|
return false
|
||||||
|
|
||||||
|
// CJK unified ideographs extension A (Chinese, Japanese, and Korean)
|
||||||
|
case r >= '\u3400' && r < '\u4dbf':
|
||||||
|
return false
|
||||||
|
|
||||||
|
// CJK unified ideographs (Chinese, Japanese, and Korean)
|
||||||
|
case r >= '\u4e00' && r < '\u9fff':
|
||||||
|
return false
|
||||||
|
|
||||||
|
// CJK compatibility ideographs (Chinese, Japanese, and Korean)
|
||||||
|
case r >= '\uf900' && r < '\ufaff':
|
||||||
|
return false
|
||||||
|
|
||||||
|
// half-width katakana (Japanese only)
|
||||||
|
case r >= '\uff66' && r < '\uff9f':
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
@@ -9,72 +9,178 @@ import (
|
|||||||
func TestCamelCase(t *testing.T) {
|
func TestCamelCase(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestCamelCase")
|
assert := internal.NewAssert(t, "TestCamelCase")
|
||||||
|
|
||||||
assert.Equal("fooBar", CamelCase("foo_bar"))
|
cases := map[string]string{
|
||||||
assert.Equal("fooBar", CamelCase("Foo-Bar"))
|
"": "",
|
||||||
assert.Equal("fooBar", CamelCase("Foo&bar"))
|
"foobar": "foobar",
|
||||||
assert.Equal("fooBar", CamelCase("foo bar"))
|
"&FOO:BAR$BAZ": "fooBarBaz",
|
||||||
|
"fooBar": "fooBar",
|
||||||
|
"FOObar": "foObar",
|
||||||
|
"$foo%": "foo",
|
||||||
|
" $#$Foo 22 bar ": "foo22Bar",
|
||||||
|
"Foo-#1😄$_%^&*(1bar": "foo11Bar",
|
||||||
|
}
|
||||||
|
|
||||||
assert.NotEqual("FooBar", CamelCase("foo_bar"))
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, CamelCase(k))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCapitalize(t *testing.T) {
|
func TestCapitalize(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestCapitalize")
|
assert := internal.NewAssert(t, "TestCapitalize")
|
||||||
|
|
||||||
assert.Equal("Foo", Capitalize("foo"))
|
cases := map[string]string{
|
||||||
assert.Equal("Foo", Capitalize("Foo"))
|
"": "",
|
||||||
assert.Equal("Foo", Capitalize("Foo"))
|
"Foo": "Foo",
|
||||||
|
"_foo": "_foo",
|
||||||
|
"foobar": "Foobar",
|
||||||
|
"fooBar": "Foobar",
|
||||||
|
"foo Bar": "Foo bar",
|
||||||
|
"foo-bar": "Foo-bar",
|
||||||
|
"$foo%": "$foo%",
|
||||||
|
}
|
||||||
|
|
||||||
assert.NotEqual("foo", Capitalize("Foo"))
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, Capitalize(k))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestKebabCase(t *testing.T) {
|
func TestKebabCase(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestKebabCase")
|
assert := internal.NewAssert(t, "TestKebabCase")
|
||||||
|
|
||||||
assert.Equal("foo-bar", KebabCase("Foo Bar-"))
|
cases := map[string]string{
|
||||||
assert.Equal("foo-bar", KebabCase("foo_Bar"))
|
"": "",
|
||||||
assert.Equal("foo-bar", KebabCase("fooBar"))
|
"foo-bar": "foo-bar",
|
||||||
assert.Equal("f-o-o-b-a-r", KebabCase("__FOO_BAR__"))
|
"--Foo---Bar-": "foo-bar",
|
||||||
|
"Foo Bar-": "foo-bar",
|
||||||
|
"foo_Bar": "foo-bar",
|
||||||
|
"fooBar": "foo-bar",
|
||||||
|
"FOOBAR": "foobar",
|
||||||
|
"FOO_BAR": "foo-bar",
|
||||||
|
"__FOO_BAR__": "foo-bar",
|
||||||
|
"$foo@Bar": "foo-bar",
|
||||||
|
" $#$Foo 22 bar ": "foo-22-bar",
|
||||||
|
"Foo-#1😄$_%^&*(1bar": "foo-1-1-bar",
|
||||||
|
}
|
||||||
|
|
||||||
assert.NotEqual("foo_bar", KebabCase("fooBar"))
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, KebabCase(k))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUpperKebabCase(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestUpperKebabCase")
|
||||||
|
|
||||||
|
cases := map[string]string{
|
||||||
|
"": "",
|
||||||
|
"foo-bar": "FOO-BAR",
|
||||||
|
"--Foo---Bar-": "FOO-BAR",
|
||||||
|
"Foo Bar-": "FOO-BAR",
|
||||||
|
"foo_Bar": "FOO-BAR",
|
||||||
|
"fooBar": "FOO-BAR",
|
||||||
|
"FOOBAR": "FOOBAR",
|
||||||
|
"FOO_BAR": "FOO-BAR",
|
||||||
|
"__FOO_BAR__": "FOO-BAR",
|
||||||
|
"$foo@Bar": "FOO-BAR",
|
||||||
|
" $#$Foo 22 bar ": "FOO-22-BAR",
|
||||||
|
"Foo-#1😄$_%^&*(1bar": "FOO-1-1-BAR",
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, UpperKebabCase(k))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSnakeCase(t *testing.T) {
|
func TestSnakeCase(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestSnakeCase")
|
assert := internal.NewAssert(t, "TestSnakeCase")
|
||||||
|
|
||||||
assert.Equal("foo_bar", SnakeCase("Foo Bar-"))
|
cases := map[string]string{
|
||||||
assert.Equal("foo_bar", SnakeCase("foo_Bar"))
|
"": "",
|
||||||
assert.Equal("foo_bar", SnakeCase("fooBar"))
|
"foo-bar": "foo_bar",
|
||||||
assert.Equal("f_o_o_b_a_r", SnakeCase("__FOO_BAR__"))
|
"--Foo---Bar-": "foo_bar",
|
||||||
assert.Equal("a_bbc_s_a_b_b_c", SnakeCase("aBbc-s$@a&%_B.B^C"))
|
"Foo Bar-": "foo_bar",
|
||||||
|
"foo_Bar": "foo_bar",
|
||||||
|
"fooBar": "foo_bar",
|
||||||
|
"FOOBAR": "foobar",
|
||||||
|
"FOO_BAR": "foo_bar",
|
||||||
|
"__FOO_BAR__": "foo_bar",
|
||||||
|
"$foo@Bar": "foo_bar",
|
||||||
|
" $#$Foo 22 bar ": "foo_22_bar",
|
||||||
|
"Foo-#1😄$_%^&*(1bar": "foo_1_1_bar",
|
||||||
|
}
|
||||||
|
|
||||||
assert.NotEqual("foo-bar", SnakeCase("foo_Bar"))
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, SnakeCase(k))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUpperSnakeCase(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestUpperSnakeCase")
|
||||||
|
|
||||||
|
cases := map[string]string{
|
||||||
|
"": "",
|
||||||
|
"foo-bar": "FOO_BAR",
|
||||||
|
"--Foo---Bar-": "FOO_BAR",
|
||||||
|
"Foo Bar-": "FOO_BAR",
|
||||||
|
"foo_Bar": "FOO_BAR",
|
||||||
|
"fooBar": "FOO_BAR",
|
||||||
|
"FOOBAR": "FOOBAR",
|
||||||
|
"FOO_BAR": "FOO_BAR",
|
||||||
|
"__FOO_BAR__": "FOO_BAR",
|
||||||
|
"$foo@Bar": "FOO_BAR",
|
||||||
|
" $#$Foo 22 bar ": "FOO_22_BAR",
|
||||||
|
"Foo-#1😄$_%^&*(1bar": "FOO_1_1_BAR",
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, UpperSnakeCase(k))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUpperFirst(t *testing.T) {
|
func TestUpperFirst(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestLowerFirst")
|
assert := internal.NewAssert(t, "TestLowerFirst")
|
||||||
|
|
||||||
assert.Equal("Foo", UpperFirst("foo"))
|
cases := map[string]string{
|
||||||
assert.Equal("BAR", UpperFirst("bAR"))
|
"": "",
|
||||||
assert.Equal("FOo", UpperFirst("FOo"))
|
"foo": "Foo",
|
||||||
assert.Equal("FOo大", UpperFirst("fOo大"))
|
"bAR": "BAR",
|
||||||
|
"FOo": "FOo",
|
||||||
|
"fOo大": "FOo大",
|
||||||
|
}
|
||||||
|
|
||||||
assert.NotEqual("Bar", UpperFirst("BAR"))
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, UpperFirst(k))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLowerFirst(t *testing.T) {
|
func TestLowerFirst(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestLowerFirst")
|
assert := internal.NewAssert(t, "TestLowerFirst")
|
||||||
|
|
||||||
assert.Equal("foo", LowerFirst("foo"))
|
cases := map[string]string{
|
||||||
assert.Equal("bAR", LowerFirst("BAR"))
|
"": "",
|
||||||
assert.Equal("fOo", LowerFirst("FOo"))
|
"foo": "foo",
|
||||||
assert.Equal("fOo大", LowerFirst("FOo大"))
|
"bAR": "bAR",
|
||||||
|
"FOo": "fOo",
|
||||||
|
"fOo大": "fOo大",
|
||||||
|
}
|
||||||
|
|
||||||
assert.NotEqual("Bar", LowerFirst("BAR"))
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, LowerFirst(k))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPad(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestPad")
|
||||||
|
|
||||||
|
assert.Equal("a ", Pad("a", 2, ""))
|
||||||
|
assert.Equal("a", Pad("a", 1, "b"))
|
||||||
|
assert.Equal("ab", Pad("a", 2, "b"))
|
||||||
|
assert.Equal("mabcdm", Pad("abcd", 6, "m"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPadEnd(t *testing.T) {
|
func TestPadEnd(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestPadEnd")
|
assert := internal.NewAssert(t, "TestPadEnd")
|
||||||
|
|
||||||
|
assert.Equal("a ", PadEnd("a", 2, " "))
|
||||||
assert.Equal("a", PadEnd("a", 1, "b"))
|
assert.Equal("a", PadEnd("a", 1, "b"))
|
||||||
assert.Equal("ab", PadEnd("a", 2, "b"))
|
assert.Equal("ab", PadEnd("a", 2, "b"))
|
||||||
assert.Equal("abcdmn", PadEnd("abcd", 6, "mno"))
|
assert.Equal("abcdmn", PadEnd("abcd", 6, "mno"))
|
||||||
@@ -143,11 +249,11 @@ func TestIsString(t *testing.T) {
|
|||||||
assert.Equal(false, IsString([]string{}))
|
assert.Equal(false, IsString([]string{}))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReverseStr(t *testing.T) {
|
func TestReverse(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestReverseStr")
|
assert := internal.NewAssert(t, "TestReverse")
|
||||||
|
|
||||||
assert.Equal("cba", ReverseStr("abc"))
|
assert.Equal("cba", Reverse("abc"))
|
||||||
assert.Equal("54321", ReverseStr("12345"))
|
assert.Equal("54321", Reverse("12345"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWrap(t *testing.T) {
|
func TestWrap(t *testing.T) {
|
||||||
@@ -177,3 +283,49 @@ func TestUnwrap(t *testing.T) {
|
|||||||
assert.Equal("***", Unwrap("***", "**"))
|
assert.Equal("***", Unwrap("***", "**"))
|
||||||
assert.Equal("**", Unwrap("**", "**"))
|
assert.Equal("**", Unwrap("**", "**"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSplitEx(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestSplitEx")
|
||||||
|
|
||||||
|
assert.Equal([]string{}, SplitEx(" a b c ", "", true))
|
||||||
|
|
||||||
|
assert.Equal([]string{"", "a", "b", "c", ""}, SplitEx(" a b c ", " ", false))
|
||||||
|
assert.Equal([]string{"a", "b", "c"}, SplitEx(" a b c ", " ", true))
|
||||||
|
|
||||||
|
assert.Equal([]string{" a", "b", "c", ""}, SplitEx(" a = b = c = ", " = ", false))
|
||||||
|
assert.Equal([]string{" a", "b", "c"}, SplitEx(" a = b = c = ", " = ", true))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSplitWords(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestSplitWords")
|
||||||
|
|
||||||
|
cases := map[string][]string{
|
||||||
|
"a word": {"a", "word"},
|
||||||
|
"I'am a programmer": {"I'am", "a", "programmer"},
|
||||||
|
"Bonjour, je suis programmeur": {"Bonjour", "je", "suis", "programmeur"},
|
||||||
|
"a -b-c' 'd'e": {"a", "b-c'", "d'e"},
|
||||||
|
"你好,我是一名码农": nil,
|
||||||
|
"こんにちは,私はプログラマーです": nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, SplitWords(k))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWordCount(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestSplitWords")
|
||||||
|
|
||||||
|
cases := map[string]int{
|
||||||
|
"a word": 2, // {"a", "word"},
|
||||||
|
"I'am a programmer": 3, // {"I'am", "a", "programmer"},
|
||||||
|
"Bonjour, je suis programmeur": 4, // {"Bonjour", "je", "suis", "programmeur"},
|
||||||
|
"a -b-c' 'd'e": 3, // {"a", "b-c'", "d'e"},
|
||||||
|
"你好,我是一名码农": 0, // nil,
|
||||||
|
"こんにちは,私はプログラマーです": 0, // nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range cases {
|
||||||
|
assert.Equal(v, WordCount(k))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package strutil
|
|
||||||
|
|
||||||
import "strings"
|
|
||||||
|
|
||||||
// splitWordsToLower split a string into worlds by uppercase char
|
|
||||||
func splitWordsToLower(s string) []string {
|
|
||||||
var res []string
|
|
||||||
|
|
||||||
upperIndexes := upperIndex(s)
|
|
||||||
l := len(upperIndexes)
|
|
||||||
if upperIndexes == nil || l == 0 {
|
|
||||||
if s != "" {
|
|
||||||
res = append(res, s)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
if i < l-1 {
|
|
||||||
res = append(res, strings.ToLower(s[upperIndexes[i]:upperIndexes[i+1]]))
|
|
||||||
} else {
|
|
||||||
res = append(res, strings.ToLower(s[upperIndexes[i]:]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
// upperIndex get a int slice which elements are all the uppercase char index of a string
|
|
||||||
func upperIndex(s string) []int {
|
|
||||||
var res []int
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
if 64 < s[i] && s[i] < 91 {
|
|
||||||
res = append(res, i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(s) > 0 && res != nil && res[0] != 0 {
|
|
||||||
res = append([]int{0}, res...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
56
system/os.go
56
system/os.go
@@ -9,6 +9,10 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"github.com/duke-git/lancet/validator"
|
||||||
|
"golang.org/x/text/encoding/simplifiedchinese"
|
||||||
)
|
)
|
||||||
|
|
||||||
// IsWindows check if current os is windows
|
// IsWindows check if current os is windows
|
||||||
@@ -50,23 +54,63 @@ func CompareOsEnv(key, comparedEnv string) bool {
|
|||||||
return env == comparedEnv
|
return env == comparedEnv
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecCommand use shell /bin/bash -c to execute command
|
// ExecCommand execute command, return the stdout and stderr string of command, and error if error occur
|
||||||
|
// param `command` is a complete command string, like, ls -a (linux), dir(windows), ping 127.0.0.1
|
||||||
|
// in linux, use /bin/bash -c to execute command
|
||||||
|
// in windows, use powershell.exe to execute command
|
||||||
func ExecCommand(command string) (stdout, stderr string, err error) {
|
func ExecCommand(command string) (stdout, stderr string, err error) {
|
||||||
var out bytes.Buffer
|
var out bytes.Buffer
|
||||||
var errout bytes.Buffer
|
var errOut bytes.Buffer
|
||||||
|
|
||||||
cmd := exec.Command("/bin/bash", "-c", command)
|
cmd := exec.Command("/bin/bash", "-c", command)
|
||||||
if IsWindows() {
|
if IsWindows() {
|
||||||
cmd = exec.Command("cmd")
|
cmd = exec.Command("powershell.exe", command)
|
||||||
}
|
}
|
||||||
cmd.Stdout = &out
|
cmd.Stdout = &out
|
||||||
cmd.Stderr = &errout
|
cmd.Stderr = &errOut
|
||||||
|
|
||||||
err = cmd.Run()
|
err = cmd.Run()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
stderr = string(errout.Bytes())
|
if utf8.Valid(errOut.Bytes()) {
|
||||||
|
stderr = byteToString(errOut.Bytes(), "UTF8")
|
||||||
|
} else if validator.IsGBK(errOut.Bytes()) {
|
||||||
|
stderr = byteToString(errOut.Bytes(), "GBK")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data := out.Bytes()
|
||||||
|
if utf8.Valid(data) {
|
||||||
|
stdout = byteToString(data, "UTF8")
|
||||||
|
} else if validator.IsGBK(data) {
|
||||||
|
stdout = byteToString(data, "GBK")
|
||||||
}
|
}
|
||||||
stdout = string(out.Bytes())
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func byteToString(data []byte, charset string) string {
|
||||||
|
var result string
|
||||||
|
|
||||||
|
switch charset {
|
||||||
|
case "GBK":
|
||||||
|
decodeBytes, _ := simplifiedchinese.GBK.NewDecoder().Bytes(data)
|
||||||
|
result = string(decodeBytes)
|
||||||
|
case "GB18030":
|
||||||
|
decodeBytes, _ := simplifiedchinese.GB18030.NewDecoder().Bytes(data)
|
||||||
|
result = string(decodeBytes)
|
||||||
|
case "UTF8":
|
||||||
|
fallthrough
|
||||||
|
default:
|
||||||
|
result = string(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetOsBits get this system bits 32bit or 64bit
|
||||||
|
// return bit int (32/64)
|
||||||
|
func GetOsBits() int {
|
||||||
|
return 32 << (^uint(0) >> 63)
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ func TestOsDetection(t *testing.T) {
|
|||||||
assert := internal.NewAssert(t, "TestOsJudgment")
|
assert := internal.NewAssert(t, "TestOsJudgment")
|
||||||
|
|
||||||
osType, _, _ := ExecCommand("echo $OSTYPE")
|
osType, _, _ := ExecCommand("echo $OSTYPE")
|
||||||
if strings.Index(osType, "linux") != -1 {
|
if strings.Contains(osType, "linux") {
|
||||||
assert.Equal(true, IsLinux())
|
assert.Equal(true, IsLinux())
|
||||||
}
|
}
|
||||||
if strings.Index(osType, "darwin") != -1 {
|
if strings.Contains(osType, "darwin") {
|
||||||
assert.Equal(true, IsMac())
|
assert.Equal(true, IsMac())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,19 +44,34 @@ func TestOsEnvOperation(t *testing.T) {
|
|||||||
func TestExecCommand(t *testing.T) {
|
func TestExecCommand(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestExecCommand")
|
assert := internal.NewAssert(t, "TestExecCommand")
|
||||||
|
|
||||||
out, errout, err := ExecCommand("ls")
|
// linux or mac
|
||||||
t.Log("std out: ", out)
|
stdout, stderr, err := ExecCommand("ls")
|
||||||
t.Log("std err: ", errout)
|
t.Log("std out: ", stdout)
|
||||||
|
t.Log("std err: ", stderr)
|
||||||
|
assert.Equal("", stderr)
|
||||||
assert.IsNil(err)
|
assert.IsNil(err)
|
||||||
|
|
||||||
out, errout, err = ExecCommand("abc")
|
// windows
|
||||||
t.Log("std out: ", out)
|
stdout, stderr, err = ExecCommand("dir")
|
||||||
t.Log("std err: ", errout)
|
t.Log("std out: ", stdout)
|
||||||
if err != nil {
|
t.Log("std err: ", stderr)
|
||||||
t.Logf("error: %v\n", err)
|
if IsWindows() {
|
||||||
|
assert.IsNil(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !IsWindows() {
|
// error command
|
||||||
assert.IsNotNil(err)
|
stdout, stderr, err = ExecCommand("abc")
|
||||||
|
t.Log("std out: ", stdout)
|
||||||
|
t.Log("std err: ", stderr)
|
||||||
|
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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,17 +8,31 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
)
|
)
|
||||||
|
|
||||||
var isAlphaRegexMatcher *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z]+$`)
|
var (
|
||||||
|
alphaMatcher *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z]+$`)
|
||||||
|
letterRegexMatcher *regexp.Regexp = regexp.MustCompile(`[a-zA-Z]`)
|
||||||
|
intStrMatcher *regexp.Regexp = regexp.MustCompile(`^[\+-]?\d+$`)
|
||||||
|
urlMatcher *regexp.Regexp = regexp.MustCompile(`^((ftp|http|https?):\/\/)?(\S+(:\S*)?@)?((([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(([a-zA-Z0-9]+([-\.][a-zA-Z0-9]+)*)|((www\.)?))?(([a-z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-z\x{00a1}-\x{ffff}]{2,}))?))(:(\d{1,5}))?((\/|\?|#)[^\s]*)?$`)
|
||||||
|
dnsMatcher *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z]([a-zA-Z0-9\-]+[\.]?)*[a-zA-Z0-9]$`)
|
||||||
|
emailMatcher *regexp.Regexp = regexp.MustCompile(`\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`)
|
||||||
|
chineseMobileMatcher *regexp.Regexp = regexp.MustCompile(`^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$`)
|
||||||
|
chineseIdMatcher *regexp.Regexp = regexp.MustCompile(`^[1-9]\d{5}(18|19|20|21|22)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$`)
|
||||||
|
chineseMatcher *regexp.Regexp = regexp.MustCompile("[\u4e00-\u9fa5]")
|
||||||
|
chinesePhoneMatcher *regexp.Regexp = regexp.MustCompile(`\d{3}-\d{8}|\d{4}-\d{7}`)
|
||||||
|
creditCardMatcher *regexp.Regexp = regexp.MustCompile(`^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$`)
|
||||||
|
base64Matcher *regexp.Regexp = regexp.MustCompile(`^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$`)
|
||||||
|
)
|
||||||
|
|
||||||
// IsAlpha checks if the string contains only letters (a-zA-Z)
|
// IsAlpha checks if the string contains only letters (a-zA-Z)
|
||||||
func IsAlpha(str string) bool {
|
func IsAlpha(str string) bool {
|
||||||
return isAlphaRegexMatcher.MatchString(str)
|
return alphaMatcher.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsAllUpper check if the string is all upper case letters A-Z
|
// IsAllUpper check if the string is all upper case letters A-Z
|
||||||
@@ -61,11 +75,9 @@ func ContainLower(str string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
var containLetterRegexMatcher *regexp.Regexp = regexp.MustCompile(`[a-zA-Z]`)
|
|
||||||
|
|
||||||
// ContainLetter check if the string contain at least one letter
|
// ContainLetter check if the string contain at least one letter
|
||||||
func ContainLetter(str string) bool {
|
func ContainLetter(str string) bool {
|
||||||
return containLetterRegexMatcher.MatchString(str)
|
return letterRegexMatcher.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsJSON checks if the string is valid JSON
|
// IsJSON checks if the string is valid JSON
|
||||||
@@ -85,11 +97,9 @@ func IsFloatStr(str string) bool {
|
|||||||
return e == nil
|
return e == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var isIntStrRegexMatcher *regexp.Regexp = regexp.MustCompile(`^[\+-]?\d+$`)
|
|
||||||
|
|
||||||
// IsIntStr check if the string can convert to a integer.
|
// IsIntStr check if the string can convert to a integer.
|
||||||
func IsIntStr(str string) bool {
|
func IsIntStr(str string) bool {
|
||||||
return isIntStrRegexMatcher.MatchString(str)
|
return intStrMatcher.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsIp check if the string is a ip address.
|
// IsIp check if the string is a ip address.
|
||||||
@@ -124,8 +134,6 @@ func IsPort(str string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
var isUrlRegexMatcher *regexp.Regexp = regexp.MustCompile(`^((ftp|http|https?):\/\/)?(\S+(:\S*)?@)?((([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(([a-zA-Z0-9]+([-\.][a-zA-Z0-9]+)*)|((www\.)?))?(([a-z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-z\x{00a1}-\x{ffff}]{2,}))?))(:(\d{1,5}))?((\/|\?|#)[^\s]*)?$`)
|
|
||||||
|
|
||||||
// IsUrl check if the string is url.
|
// IsUrl check if the string is url.
|
||||||
func IsUrl(str string) bool {
|
func IsUrl(str string) bool {
|
||||||
if str == "" || len(str) >= 2083 || len(str) <= 3 || strings.HasPrefix(str, ".") {
|
if str == "" || len(str) >= 2083 || len(str) <= 3 || strings.HasPrefix(str, ".") {
|
||||||
@@ -142,64 +150,48 @@ func IsUrl(str string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
return isUrlRegexMatcher.MatchString(str)
|
return urlMatcher.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
var isDnsRegexMatcher *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z]([a-zA-Z0-9\-]+[\.]?)*[a-zA-Z0-9]$`)
|
|
||||||
|
|
||||||
// IsDns check if the string is dns.
|
// IsDns check if the string is dns.
|
||||||
func IsDns(dns string) bool {
|
func IsDns(dns string) bool {
|
||||||
return isDnsRegexMatcher.MatchString(dns)
|
return dnsMatcher.MatchString(dns)
|
||||||
}
|
}
|
||||||
|
|
||||||
var isEmailRegexMatcher *regexp.Regexp = regexp.MustCompile(`\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`)
|
|
||||||
|
|
||||||
// IsEmail check if the string is a email address.
|
// IsEmail check if the string is a email address.
|
||||||
func IsEmail(email string) bool {
|
func IsEmail(email string) bool {
|
||||||
return isEmailRegexMatcher.MatchString(email)
|
return emailMatcher.MatchString(email)
|
||||||
}
|
}
|
||||||
|
|
||||||
var isChineseMobileRegexMatcher *regexp.Regexp = regexp.MustCompile("^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$")
|
|
||||||
|
|
||||||
// IsChineseMobile check if the string is chinese mobile number.
|
// IsChineseMobile check if the string is chinese mobile number.
|
||||||
func IsChineseMobile(mobileNum string) bool {
|
func IsChineseMobile(mobileNum string) bool {
|
||||||
return isChineseMobileRegexMatcher.MatchString(mobileNum)
|
return chineseMobileMatcher.MatchString(mobileNum)
|
||||||
}
|
}
|
||||||
|
|
||||||
var isChineseIdNumRegexMatcher *regexp.Regexp = regexp.MustCompile(`^[1-9]\d{5}(18|19|20|21|22)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$`)
|
|
||||||
|
|
||||||
// IsChineseIdNum check if the string is chinese id number.
|
// IsChineseIdNum check if the string is chinese id number.
|
||||||
func IsChineseIdNum(id string) bool {
|
func IsChineseIdNum(id string) bool {
|
||||||
return isChineseIdNumRegexMatcher.MatchString(id)
|
return chineseIdMatcher.MatchString(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
var containChineseRegexMatcher *regexp.Regexp = regexp.MustCompile("[\u4e00-\u9fa5]")
|
|
||||||
|
|
||||||
// ContainChinese check if the string contain mandarin chinese.
|
// ContainChinese check if the string contain mandarin chinese.
|
||||||
func ContainChinese(s string) bool {
|
func ContainChinese(s string) bool {
|
||||||
return containChineseRegexMatcher.MatchString(s)
|
return chineseMatcher.MatchString(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
var isChinesePhoneRegexMatcher *regexp.Regexp = regexp.MustCompile(`\d{3}-\d{8}|\d{4}-\d{7}`)
|
|
||||||
|
|
||||||
// IsChinesePhone check if the string is chinese phone number.
|
// IsChinesePhone check if the string is chinese phone number.
|
||||||
// Valid chinese phone is xxx-xxxxxxxx or xxxx-xxxxxxx
|
// Valid chinese phone is xxx-xxxxxxxx or xxxx-xxxxxxx
|
||||||
func IsChinesePhone(phone string) bool {
|
func IsChinesePhone(phone string) bool {
|
||||||
return isChinesePhoneRegexMatcher.MatchString(phone)
|
return chinesePhoneMatcher.MatchString(phone)
|
||||||
}
|
}
|
||||||
|
|
||||||
var isCreditCardRegexMatcher *regexp.Regexp = regexp.MustCompile(`^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$`)
|
|
||||||
|
|
||||||
// IsCreditCard check if the string is credit card.
|
// IsCreditCard check if the string is credit card.
|
||||||
func IsCreditCard(creditCart string) bool {
|
func IsCreditCard(creditCart string) bool {
|
||||||
return isCreditCardRegexMatcher.MatchString(creditCart)
|
return creditCardMatcher.MatchString(creditCart)
|
||||||
}
|
}
|
||||||
|
|
||||||
var isBase64RegexMatcher *regexp.Regexp = regexp.MustCompile(`^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$`)
|
|
||||||
|
|
||||||
// IsBase64 check if the string is base64 string.
|
// IsBase64 check if the string is base64 string.
|
||||||
func IsBase64(base64 string) bool {
|
func IsBase64(base64 string) bool {
|
||||||
return isBase64RegexMatcher.MatchString(base64)
|
return base64Matcher.MatchString(base64)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsEmptyString check if the string is empty.
|
// IsEmptyString check if the string is empty.
|
||||||
@@ -258,3 +250,69 @@ func IsWeakPassword(password string) bool {
|
|||||||
|
|
||||||
return (num || letter) && !special
|
return (num || letter) && !special
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsZeroValue checks if value is a zero value
|
||||||
|
func IsZeroValue(value interface{}) bool {
|
||||||
|
if value == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
rv := reflect.ValueOf(value)
|
||||||
|
if !rv.IsValid() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
switch rv.Kind() {
|
||||||
|
case reflect.String:
|
||||||
|
return rv.Len() == 0
|
||||||
|
case reflect.Bool:
|
||||||
|
return !rv.Bool()
|
||||||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
return rv.Int() == 0
|
||||||
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||||
|
return rv.Uint() == 0
|
||||||
|
case reflect.Float32, reflect.Float64:
|
||||||
|
return rv.Float() == 0
|
||||||
|
case reflect.Ptr, reflect.Chan, reflect.Func, reflect.Interface, reflect.Slice, reflect.Map:
|
||||||
|
return rv.IsNil()
|
||||||
|
}
|
||||||
|
|
||||||
|
return reflect.DeepEqual(rv.Interface(), reflect.Zero(rv.Type()).Interface())
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsGBK check if data encoding is gbk
|
||||||
|
// Note: this function is implemented by whether double bytes fall within the encoding range of gbk,
|
||||||
|
// while each byte of utf-8 encoding format falls within the encoding range of gbk.
|
||||||
|
// Therefore, utf8.valid() should be called first to check whether it is not utf-8 encoding,
|
||||||
|
// and then call IsGBK() to check gbk encoding. like below
|
||||||
|
/**
|
||||||
|
data := []byte("你好")
|
||||||
|
if utf8.Valid(data) {
|
||||||
|
fmt.Println("data encoding is utf-8")
|
||||||
|
}else if(IsGBK(data)) {
|
||||||
|
fmt.Println("data encoding is GBK")
|
||||||
|
}
|
||||||
|
fmt.Println("data encoding is unknown")
|
||||||
|
**/
|
||||||
|
func IsGBK(data []byte) bool {
|
||||||
|
i := 0
|
||||||
|
for i < len(data) {
|
||||||
|
if data[i] <= 0xff {
|
||||||
|
i++
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
if data[i] >= 0x81 &&
|
||||||
|
data[i] <= 0xfe &&
|
||||||
|
data[i+1] >= 0x40 &&
|
||||||
|
data[i+1] <= 0xfe &&
|
||||||
|
data[i+1] != 0xf7 {
|
||||||
|
i += 2
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package validator
|
package validator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/duke-git/lancet/internal"
|
"github.com/duke-git/lancet/internal"
|
||||||
|
"golang.org/x/text/encoding/simplifiedchinese"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestIsAllUpper(t *testing.T) {
|
func TestIsAllUpper(t *testing.T) {
|
||||||
@@ -279,3 +283,120 @@ func TestIsWeakPassword(t *testing.T) {
|
|||||||
assert.Equal(true, IsWeakPassword("abcABC123"))
|
assert.Equal(true, IsWeakPassword("abcABC123"))
|
||||||
assert.Equal(false, IsWeakPassword("abc123@#$"))
|
assert.Equal(false, IsWeakPassword("abc123@#$"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIsZeroValue(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestIsZeroValue")
|
||||||
|
|
||||||
|
var (
|
||||||
|
zeroPtr *string
|
||||||
|
zeroSlice []int
|
||||||
|
zeroFunc func() string
|
||||||
|
zeroMap map[string]string
|
||||||
|
nilIface interface{}
|
||||||
|
zeroIface fmt.Formatter
|
||||||
|
)
|
||||||
|
zeroValues := []interface{}{
|
||||||
|
nil,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
int8(0),
|
||||||
|
int16(0),
|
||||||
|
int32(0),
|
||||||
|
int64(0),
|
||||||
|
uint(0),
|
||||||
|
uint8(0),
|
||||||
|
uint16(0),
|
||||||
|
uint32(0),
|
||||||
|
uint64(0),
|
||||||
|
|
||||||
|
0.0,
|
||||||
|
float32(0.0),
|
||||||
|
float64(0.0),
|
||||||
|
|
||||||
|
"",
|
||||||
|
|
||||||
|
// func
|
||||||
|
zeroFunc,
|
||||||
|
|
||||||
|
// array / slice
|
||||||
|
[0]int{},
|
||||||
|
zeroSlice,
|
||||||
|
|
||||||
|
// map
|
||||||
|
zeroMap,
|
||||||
|
|
||||||
|
// interface
|
||||||
|
nilIface,
|
||||||
|
zeroIface,
|
||||||
|
|
||||||
|
// pointer
|
||||||
|
zeroPtr,
|
||||||
|
|
||||||
|
// struct
|
||||||
|
time.Time{},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, value := range zeroValues {
|
||||||
|
assert.Equal(true, IsZeroValue(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
var nonZeroIface fmt.Stringer = time.Now()
|
||||||
|
|
||||||
|
nonZeroValues := []interface{}{
|
||||||
|
// bool
|
||||||
|
true,
|
||||||
|
|
||||||
|
// int
|
||||||
|
1,
|
||||||
|
int8(1),
|
||||||
|
int16(1),
|
||||||
|
int32(1),
|
||||||
|
int64(1),
|
||||||
|
uint8(1),
|
||||||
|
uint16(1),
|
||||||
|
uint32(1),
|
||||||
|
uint64(1),
|
||||||
|
|
||||||
|
// float
|
||||||
|
1.0,
|
||||||
|
float32(1.0),
|
||||||
|
float64(1.0),
|
||||||
|
|
||||||
|
// string
|
||||||
|
"test",
|
||||||
|
|
||||||
|
// func
|
||||||
|
time.Now,
|
||||||
|
|
||||||
|
// array / slice
|
||||||
|
[]int{},
|
||||||
|
[]int{42},
|
||||||
|
[1]int{42},
|
||||||
|
|
||||||
|
// map
|
||||||
|
make(map[string]string, 1),
|
||||||
|
|
||||||
|
// interface
|
||||||
|
nonZeroIface,
|
||||||
|
|
||||||
|
// pointer
|
||||||
|
&nonZeroIface,
|
||||||
|
|
||||||
|
// struct
|
||||||
|
time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, value := range nonZeroValues {
|
||||||
|
assert.Equal(false, IsZeroValue(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIsGBK(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestIsGBK")
|
||||||
|
|
||||||
|
str := "你好"
|
||||||
|
gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
|
||||||
|
|
||||||
|
assert.Equal(true, IsGBK(gbkData))
|
||||||
|
assert.Equal(false, utf8.Valid(gbkData))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user