1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-05 13:22:26 +08:00

Compare commits

...

6 Commits

Author SHA1 Message Date
dudaodong
69b34faeec update build tag 2024-12-04 19:07:58 +08:00
dudaodong
9af645606b release v1.4.6 2024-12-04 19:02:07 +08:00
dudaodong
f58b706285 fix: fix issue #275 2024-12-04 16:37:46 +08:00
dudaodong
0f9683a764 release v1.4.5 2024-12-04 10:42:55 +08:00
dudaodong
4595a94b4c update doc 2024-12-04 10:40:18 +08:00
dudaodong
e1e15883e9 fix: MaxInt was added only in 1.17 use instead 2024-11-27 15:09:23 +08:00
22 changed files with 532 additions and 206 deletions

View File

@@ -4,7 +4,7 @@
<br/>
![Go version](https://img.shields.io/badge/go-v1.16-9cf)
[![Release](https://img.shields.io/badge/release-1.4.4-green.svg)](https://github.com/duke-git/lancet/releases)
[![Release](https://img.shields.io/badge/release-1.4.6-green.svg)](https://github.com/duke-git/lancet/releases)
[![GoDoc](https://godoc.org/github.com//duke-git/lancet?status.svg)](https://pkg.go.dev/github.com/duke-git/lancet)
[![Go Report Card](https://goreportcard.com/badge/github.com/duke-git/lancet)](https://goreportcard.com/report/github.com/duke-git/lancet)
[![test](https://github.com/duke-git/lancet/actions/workflows/codecov.yml/badge.svg?branch=main&event=push)](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
@@ -108,6 +108,7 @@ import "github.com/duke-git/lancet/convertor"
- [ToUrlBase64](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToUrlBase64)
- [ToRawStdBase64](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToRawStdBase64)
- [ToRawUrlBase64](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToRawUrlBase64)
- [ToBigInt](https://github.com/duke-git/lancet/blob/v1/docs/convertor.md#ToBigInt)
### 3. Cryptor package is for data encryption and decryption.
@@ -483,6 +484,7 @@ import "github.com/duke-git/lancet/strutil"
- [Rotate](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#Rotate)
- [TemplateReplace](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#TemplateReplace)
- [RegexMatchAllGroups](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#RegexMatchAllGroups)
- [Cut](https://github.com/duke-git/lancet/blob/v1/docs/strutil.md#Cut)
### 14. System package contain some functions about os, runtime, shell command.

View File

@@ -4,7 +4,7 @@
<br/>
![Go version](https://img.shields.io/badge/go-v1.16-9cf)
[![Release](https://img.shields.io/badge/release-1.4.4-green.svg)](https://github.com/duke-git/lancet/releases)
[![Release](https://img.shields.io/badge/release-1.4.6-green.svg)](https://github.com/duke-git/lancet/releases)
[![GoDoc](https://godoc.org/github.com//duke-git/lancet?status.svg)](https://pkg.go.dev/github.com/duke-git/lancet)
[![Go Report Card](https://goreportcard.com/badge/github.com/duke-git/lancet)](https://goreportcard.com/report/github.com/duke-git/lancet)
[![test](https://github.com/duke-git/lancet/actions/workflows/codecov.yml/badge.svg?branch=main&event=push)](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
@@ -107,6 +107,7 @@ import "github.com/duke-git/lancet/convertor"
- [ToUrlBase64](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToUrlBase64)
- [ToRawStdBase64](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToRawStdBase64)
- [ToRawUrlBase64](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToRawUrlBase64)
- [ToBigInt](https://github.com/duke-git/lancet/blob/v1/docs/convertor_zh-CN.md#ToBigInt)
### 3. cryptor 加密包支持数据加密和解密,获取 md5hash 值。支持 base64, md5, hmac, aes, des, rsa。
@@ -485,6 +486,7 @@ import "github.com/duke-git/lancet/strutil"
- [Rotate](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#Rotate)
- [TemplateReplace](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#TemplateReplace)
- [RegexMatchAllGroups](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#RegexMatchAllGroups)
- [Cut](https://github.com/duke-git/lancet/blob/v1/docs/strutil_zh-CN.md#Cut)
### 14. system 包含 os, runtime, shell command 相关函数。

View File

@@ -3,6 +3,7 @@ package compare
import (
"bytes"
"encoding/json"
"math/big"
"reflect"
"time"
@@ -36,7 +37,8 @@ func compareRefValue(operator string, leftObj, rightObj interface{}, kind reflec
case reflect.Struct:
// compare time
if leftVal.CanConvert(timeType) {
// fix: issue #275
if canConvert(leftObj, timeType) {
timeObj1, ok := leftObj.(time.Time)
if !ok {
timeObj1 = leftVal.Convert(timeType).Interface().(time.Time)
@@ -58,7 +60,7 @@ func compareRefValue(operator string, leftObj, rightObj interface{}, kind reflec
case reflect.Slice:
// compare []byte
if leftVal.CanConvert(bytesType) {
if canConvert(leftObj, bytesType) {
bytesObj1, ok := leftObj.([]byte)
if !ok {
bytesObj1 = leftVal.Convert(bytesType).Interface().([]byte)
@@ -155,169 +157,141 @@ func compareBasicValue(operator string, leftValue, rightValue interface{}) bool
}
switch leftVal := leftValue.(type) {
case json.Number:
if left, err := leftVal.Float64(); err == nil {
switch rightVal := rightValue.(type) {
case json.Number:
if right, err := rightVal.Float64(); err == nil {
switch operator {
case equal:
if left == right {
return true
}
case lessThan:
if left < right {
return true
}
case greaterThan:
if left > right {
return true
}
case lessOrEqual:
if left <= right {
return true
}
case greaterOrEqual:
if left >= right {
return true
}
}
}
case float32, float64, int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64:
right, err := convertor.ToFloat(rightValue)
if err != nil {
return false
}
switch operator {
case equal:
if left == right {
return true
}
case lessThan:
if left < right {
return true
}
case greaterThan:
if left > right {
return true
}
case lessOrEqual:
if left <= right {
return true
}
case greaterOrEqual:
if left >= right {
return true
}
}
}
case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64:
left, err := convertor.ToBigInt(leftValue)
if err != nil {
return false
}
case float32, float64, int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64:
right, err := convertor.ToBigInt(rightValue)
if err != nil {
return false
}
return compareBigInt(operator, left, right)
case float32, float64:
left, err := convertor.ToFloat(leftValue)
if err != nil {
return false
}
switch rightVal := rightValue.(type) {
case json.Number:
if right, err := rightVal.Float64(); err == nil {
switch operator {
case equal:
if left == right {
return true
}
case lessThan:
if left < right {
return true
}
case greaterThan:
if left > right {
return true
}
case lessOrEqual:
if left <= right {
return true
}
case greaterOrEqual:
if left >= right {
return true
}
}
}
case float32, float64, int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64:
right, err := convertor.ToFloat(rightValue)
if err != nil {
return false
}
switch operator {
case equal:
if left == right {
return true
}
case lessThan:
if left < right {
return true
}
case greaterThan:
if left > right {
return true
}
case lessOrEqual:
if left <= right {
return true
}
case greaterOrEqual:
if left >= right {
return true
}
}
right, err := convertor.ToFloat(rightValue)
if err != nil {
return false
}
return compareFloats(operator, left, right)
case string:
left := leftVal
switch right := rightValue.(type) {
case string:
switch operator {
case equal:
if left == right {
return true
}
case lessThan:
if left < right {
return true
}
case greaterThan:
if left > right {
return true
}
case lessOrEqual:
if left <= right {
return true
}
case greaterOrEqual:
if left >= right {
return true
}
}
return compareStrings(operator, left, right)
}
case bool:
left := leftVal
switch right := rightValue.(type) {
case bool:
switch operator {
case equal:
if left == right {
return true
}
}
return compareBools(operator, left, right)
}
case json.Number:
if left, err := leftVal.Float64(); err == nil {
switch rightVal := rightValue.(type) {
case json.Number:
if right, err := rightVal.Float64(); err == nil {
return compareFloats(operator, left, right)
}
case float32, float64:
right, err := convertor.ToFloat(rightValue)
if err != nil {
return false
}
return compareFloats(operator, left, right)
case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64:
right, err := convertor.ToBigInt(rightValue)
if err != nil {
return false
}
left, err := convertor.ToBigInt(left)
return compareBigInt(operator, left, right)
}
}
}
return false
}
// compareBigInt compares two big.Int values based on the operator
func compareBigInt(operator string, left, right *big.Int) bool {
switch operator {
case equal:
return left.Cmp(right) == 0
case lessThan:
return left.Cmp(right) < 0
case greaterThan:
return left.Cmp(right) > 0
case lessOrEqual:
return left.Cmp(right) <= 0
case greaterOrEqual:
return left.Cmp(right) >= 0
}
return false
}
// compareFloats compares two float64 values based on the operator
func compareFloats(operator string, left, right float64) bool {
switch operator {
case equal:
return left == right
case lessThan:
return left < right
case greaterThan:
return left > right
case lessOrEqual:
return left <= right
case greaterOrEqual:
return left >= right
}
return false
}
// compareStrings compares two string values based on the operator
func compareStrings(operator string, left, right string) bool {
switch operator {
case equal:
return left == right
case lessThan:
return left < right
case greaterThan:
return left > right
case lessOrEqual:
return left <= right
case greaterOrEqual:
return left >= right
}
return false
}
// compareBools compares two boolean values based on the operator
func compareBools(operator string, left, right bool) bool {
switch operator {
case equal:
return left == right
}
return false
}
// canConvert checks if the value can be converted to the target type
func canConvert(value interface{}, targetType reflect.Type) bool {
v := reflect.ValueOf(value)
defer func() {
if r := recover(); r != nil {
}
}()
v.Convert(targetType)
return true
}

View File

@@ -1,6 +1,7 @@
package compare
import (
"encoding/json"
"testing"
"time"
@@ -70,18 +71,28 @@ func TestEqualValue(t *testing.T) {
}
func TestLessThan(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLessThan")
assert.Equal(true, LessThan(1, 2))
assert.Equal(true, LessThan(1.1, 2.2))
assert.Equal(true, LessThan("a", "b"))
tests := []struct {
left interface{}
right interface{}
want bool
}{
{1, 2, true},
{1.1, 2.2, true},
{"a", "b", true},
{time.Now(), time.Now().Add(time.Second), true},
{[]byte("hello1"), []byte("hello2"), true},
{json.Number("123"), json.Number("124"), true},
{645680099112988673, 645680099112988675, true},
{1, 1, false},
{1, int64(1), false},
}
time1 := time.Now()
time2 := time1.Add(time.Second)
assert.Equal(true, LessThan(time1, time2))
assert.Equal(false, LessThan(1, 1))
assert.Equal(false, LessThan(1, int64(1)))
for _, tt := range tests {
assert.Equal(tt.want, LessThan(tt.left, tt.right))
}
}
func TestGreaterThan(t *testing.T) {

View File

@@ -14,6 +14,7 @@ import (
"fmt"
"io"
"math"
"math/big"
"reflect"
"regexp"
"strconv"
@@ -460,3 +461,36 @@ func ToRawUrlBase64(value interface{}) string {
return base64.RawURLEncoding.EncodeToString(marshal)
}
}
// ToBigInt converts an integer of any supported type (int, int64, uint64, etc.) to *big.Int
// Play: todo
func ToBigInt(v interface{}) (*big.Int, error) {
result := new(big.Int)
switch v := (v).(type) {
case int:
result.SetInt64(int64(v))
case int8:
result.SetInt64(int64(v))
case int16:
result.SetInt64(int64(v))
case int32:
result.SetInt64(int64(v))
case int64:
result.SetInt64(v)
case uint:
result.SetUint64(uint64(v))
case uint8:
result.SetUint64(uint64(v))
case uint16:
result.SetUint64(uint64(v))
case uint32:
result.SetUint64(uint64(v))
case uint64:
result.SetUint64(v)
default:
return nil, fmt.Errorf("unsupported type: %T", v)
}
return result, nil
}

View File

@@ -240,7 +240,8 @@ func setStructField(structObj interface{}, fieldName string, fieldValue interfac
if fieldVal.Type() != val.Type() {
if val.CanConvert(fieldVal.Type()) {
// fix: issue #275
if canConvert(fieldValue, fieldVal.Type()) {
fieldVal.Set(val.Convert(fieldVal.Type()))
return nil
}
@@ -284,3 +285,14 @@ func getFieldNameByJsonTag(structObj interface{}, jsonTag string) string {
return ""
}
func canConvert(value interface{}, targetType reflect.Type) bool {
v := reflect.ValueOf(value)
defer func() {
if r := recover(); r != nil {
}
}()
v.Convert(targetType)
return true
}

View File

@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"io"
"math/big"
"reflect"
"testing"
"unicode/utf8"
@@ -684,3 +685,83 @@ func TestToRawUrlBase64(t *testing.T) {
d15, _ := base64.RawURLEncoding.DecodeString(r15)
assert.Equal("4+3/4?=", string(d15))
}
func TestToBigInt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToBigInt")
tests := []struct {
name string
input interface{}
want *big.Int
hasErr bool
}{
{
name: "int",
input: 42,
want: big.NewInt(42),
},
{
name: "int8",
input: int8(127),
want: big.NewInt(127),
},
{
name: "int16",
input: int16(32000),
want: big.NewInt(32000),
},
{
name: "int32",
input: int32(123456),
want: big.NewInt(123456),
},
{
name: "int64",
input: int64(987654321),
want: big.NewInt(987654321),
},
{
name: "uint",
input: uint(987654321),
want: big.NewInt(987654321),
},
{
name: "uint8",
input: uint8(255),
want: big.NewInt(255),
},
{
name: "uint16",
input: uint16(65535),
want: big.NewInt(65535),
},
{
name: "uint32",
input: uint32(4294967295),
want: big.NewInt(4294967295),
},
{
name: "uint64",
input: uint64(18446744073709551615),
want: new(big.Int).SetUint64(18446744073709551615),
},
{
name: "unsupported type",
input: 3.14, // Unsupported type
hasErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := ToBigInt(tt.input)
if (err != nil) != tt.hasErr {
t.Errorf("ToBigInt() error = %v, hasErr %v", err, tt.hasErr)
return
}
assert.Equal(tt.want, got)
})
}
}

View File

@@ -325,7 +325,6 @@ func TimestampNano(timezone ...string) int64 {
// TrackFuncTime track the time of function execution.
// call it at top of the func like `defer TrackFuncTime(time.Now())()`
// Play: todo
func TrackFuncTime(pre time.Time) func() {
callerName := getCallerName()
return func() {

View File

@@ -42,7 +42,7 @@ import (
<b>Signature:</b>
```go
func Equal(left, right any) bool
func Equal(left, right interface{}) bool
```
<b>Example:</b>
@@ -91,7 +91,7 @@ func main() {
<b>Signature:</b>
```go
func EqualValue(left, right any) bool
func EqualValue(left, right interface{}) bool
```
<b>Example:</b>
@@ -130,7 +130,7 @@ func main() {
<b>Signature:</b>
```go
func LessThan(left, right any) bool
func LessThan(left, right interface{}) bool
```
<b>Example:</b>
@@ -179,7 +179,7 @@ func main() {
<b>Signature:</b>
```go
func GreaterThan(left, right any) bool
func GreaterThan(left, right interface{}) bool
```
<b>Example:</b>
@@ -231,7 +231,7 @@ func main() {
<b>Signature:</b>
```go
func LessOrEqual(left, right any) bool
func LessOrEqual(left, right interface{}) bool
```
<b>Example:</b>
@@ -280,7 +280,7 @@ func main() {
<b>Signature:</b>
```go
func GreaterOrEqual(left, right any) bool
func GreaterOrEqual(left, right interface{}) bool
```
<b>Example:</b>

View File

@@ -42,7 +42,7 @@ import (
<b>函数签名:</b>
```go
func Equal(left, right any) bool
func Equal(left, right interface{}) bool
```
<b>示例:</b>
@@ -91,7 +91,7 @@ func main() {
<b>函数签名:</b>
```go
func EqualValue(left, right any) bool
func EqualValue(left, right interface{}) bool
```
<b>示例:</b>
@@ -130,7 +130,7 @@ func main() {
<b>函数签名:</b>
```go
func LessThan(left, right any) bool
func LessThan(left, right interface{}) bool
```
<b>示例:</b>
@@ -179,7 +179,7 @@ func main() {
<b>函数签名:</b>
```go
func GreaterThan(left, right any) bool
func GreaterThan(left, right interface{}) bool
```
<b>示例:</b>
@@ -231,7 +231,7 @@ func main() {
<b>函数签名:</b>
```go
func LessOrEqual(left, right any) bool
func LessOrEqual(left, right interface{}) bool
```
<b>示例:</b>
@@ -280,7 +280,7 @@ func main() {
<b>函数签名:</b>
```go
func GreaterOrEqual(left, right any) bool
func GreaterOrEqual(left, right interface{}) bool
```
<b>示例:</b>

View File

@@ -45,7 +45,7 @@ import (
- [ToUrlBase64](#ToUrlBase64)
- [ToRawStdBase64](#ToRawStdBase64)
- [ToRawUrlBase64](#ToRawUrlBase64)
- [ToBigInt](#ToBigInt)
<div STYLE="page-break-after: always;"></div>
@@ -454,7 +454,7 @@ func main() {
<b>Signature:</b>
```go
func EncodeByte(data any) ([]byte, error)
func EncodeByte(data interface{}) ([]byte, error)
```
<b>Example:</b>
@@ -480,7 +480,7 @@ func main() {
<b>Signature:</b>
```go
func DecodeByte(data []byte, target any) error
func DecodeByte(data []byte, target interface{}) error
```
<b>Example:</b>
@@ -508,7 +508,7 @@ func main() {
<b>Signature:</b>
```go
func DeepClone[T any](src T) T
func DeepClone[T interface{}](src T) T
```
<b>Example:</b>
@@ -753,7 +753,7 @@ func main() {
<b>Signature:</b>
```go
func ToStdBase64(value any) string
func ToStdBase64(value interface{}) string
```
<b>Example:</b>
@@ -785,7 +785,7 @@ func main() {
afterEncode = convertor.ToStdBase64(intVal)
fmt.Println(afterEncode)
mapVal := map[string]any{"a": "hi", "b": 2, "c": struct {
mapVal := map[string]interface{}{"a": "hi", "b": 2, "c": struct {
A string
B int
}{"hello", 3}}
@@ -825,7 +825,7 @@ func main() {
<b>Signature:</b>
```go
func ToUrlBase64(value any) string
func ToUrlBase64(value interface{}) string
```
<b>Example:</b>
@@ -855,7 +855,7 @@ func main() {
afterEncode = convertor.ToUrlBase64(intVal)
fmt.Println(afterEncode)
mapVal := map[string]any{"a": "hi", "b": 2, "c": struct {
mapVal := map[string]interface{}{"a": "hi", "b": 2, "c": struct {
A string
B int
}{"hello", 3}}
@@ -894,7 +894,7 @@ func main() {
<b>Signature:</b>
```go
func ToRawStdBase64(value any) string
func ToRawStdBase64(value interface{}) string
```
<b>Example:</b>
@@ -921,7 +921,7 @@ func main() {
afterEncode = convertor.ToRawStdBase64(intVal)
fmt.Println(afterEncode)
mapVal := map[string]any{"a": "hi", "b": 2, "c": struct {
mapVal := map[string]interface{}{"a": "hi", "b": 2, "c": struct {
A string
B int
}{"hello", 3}}
@@ -958,7 +958,7 @@ func main() {
<b>Signature:</b>
```go
func ToRawUrlBase64(value any) string
func ToRawUrlBase64(value interface{}) string
```
<b>Example:</b>
@@ -985,7 +985,7 @@ func main() {
afterEncode = convertor.ToRawUrlBase64(intVal)
fmt.Println(afterEncode)
mapVal := map[string]any{"a": "hi", "b": 2, "c": struct {
mapVal := map[string]interface{}{"a": "hi", "b": 2, "c": struct {
A string
B int
}{"hello", 3}}
@@ -1013,4 +1013,34 @@ func main() {
// dHJ1ZQ
// ZXJy
}
```
### <span id="ToBigInt">ToBigInt</span>
<p>Convert value to bigInt.</p>
<b>Signature:</b>
```go
func ToBigInt(v interface{}) (*big.Int, error)
```
<b>Example:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/convertor"
)
func main() {
n := 9876543210
bigInt, _ := convertor.ToBigInt(n)
fmt.Println(bigInt)
// Output:
// 9876543210
}
```

View File

@@ -45,6 +45,7 @@ import (
- [ToUrlBase64](#ToUrlBase64)
- [ToRawStdBase64](#ToRawStdBase64)
- [ToRawUrlBase64](#ToRawUrlBase64)
- [ToBigInt](#ToBigInt)
<div STYLE="page-break-after: always;"></div>
@@ -453,7 +454,7 @@ func main() {
<b>函数签名:</b>
```go
func EncodeByte(data any) ([]byte, error)
func EncodeByte(data interface{}) ([]byte, error)
```
<b>例子:</b>
@@ -479,7 +480,7 @@ func main() {
<b>函数签名:</b>
```go
func DecodeByte(data []byte, target any) error
func DecodeByte(data []byte, target interface{}) error
```
<b>例子:</b>
@@ -507,7 +508,7 @@ func main() {
<b>函数签名:</b>
```go
func DeepClone[T any](src T) T
func DeepClone[T interface{}](src T) T
```
<b>示例:</b>
@@ -753,7 +754,7 @@ func main() {
<b>函数签名:</b>
```go
func ToStdBase64(value any) string
func ToStdBase64(value interface{}) string
```
<b>示例:</b>
@@ -763,7 +764,7 @@ package main
import (
"fmt"
"github.com/duke-git/lancet/v2/convertor"
"github.com/duke-git/lancet/convertor"
)
func main() {
@@ -785,7 +786,7 @@ func main() {
afterEncode = convertor.ToStdBase64(intVal)
fmt.Println(afterEncode)
mapVal := map[string]any{"a": "hi", "b": 2, "c": struct {
mapVal := map[string]interface{}{"a": "hi", "b": 2, "c": struct {
A string
B int
}{"hello", 3}}
@@ -825,7 +826,7 @@ func main() {
<b>函数签名:</b>
```go
func ToUrlBase64(value any) string
func ToUrlBase64(value interface{}) string
```
<b>示例:</b>
@@ -835,7 +836,7 @@ package main
import (
"fmt"
"github.com/duke-git/lancet/v2/convertor"
"github.com/duke-git/lancet/convertor"
)
func main() {
@@ -855,7 +856,7 @@ func main() {
afterEncode = convertor.ToUrlBase64(intVal)
fmt.Println(afterEncode)
mapVal := map[string]any{"a": "hi", "b": 2, "c": struct {
mapVal := map[string]interface{}{"a": "hi", "b": 2, "c": struct {
A string
B int
}{"hello", 3}}
@@ -894,7 +895,7 @@ func main() {
<b>函数签名:</b>
```go
func ToRawStdBase64(value any) string
func ToRawStdBase64(value interface{}) string
```
<b>示例:</b>
@@ -904,7 +905,7 @@ package main
import (
"fmt"
"github.com/duke-git/lancet/v2/convertor"
"github.com/duke-git/lancet/convertor"
)
func main() {
@@ -921,7 +922,7 @@ func main() {
afterEncode = convertor.ToRawStdBase64(intVal)
fmt.Println(afterEncode)
mapVal := map[string]any{"a": "hi", "b": 2, "c": struct {
mapVal := map[string]interface{}{"a": "hi", "b": 2, "c": struct {
A string
B int
}{"hello", 3}}
@@ -958,7 +959,7 @@ func main() {
<b>函数签名:</b>
```go
func ToRawUrlBase64(value any) string
func ToRawUrlBase64(value interface{}) string
```
<b>示例:</b>
@@ -968,7 +969,7 @@ package main
import (
"fmt"
"github.com/duke-git/lancet/v2/convertor"
"github.com/duke-git/lancet/convertor"
)
func main() {
@@ -985,7 +986,7 @@ func main() {
afterEncode = convertor.ToRawUrlBase64(intVal)
fmt.Println(afterEncode)
mapVal := map[string]any{"a": "hi", "b": 2, "c": struct {
mapVal := map[string]interface{}{"a": "hi", "b": 2, "c": struct {
A string
B int
}{"hello", 3}}
@@ -1013,4 +1014,34 @@ func main() {
// dHJ1ZQ
// ZXJy
}
```
### <span id="ToBigInt">ToBigInt</span>
<p>将整数值转换为bigInt。</p>
<b>函数签名:</b>
```go
func ToBigInt(v interface{}) (*big.Int, error)
```
<b>示例:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/convertor"
)
func main() {
n := 9876543210
bigInt, _ := convertor.ToBigInt(n)
fmt.Println(bigInt)
// Output:
// 9876543210
}
```

View File

@@ -1381,7 +1381,7 @@ package main
import (
"fmt"
"github.com/duke-git/lancet/v2/datetime"
"github.com/duke-git/lancet/datetime"
)
func main() {

View File

@@ -902,7 +902,7 @@ package main
import (
"fmt"
"github.com/duke-git/lancet/v2/fileutil"
"github.com/duke-git/lancet/fileutil"
)
func main() {

View File

@@ -900,7 +900,7 @@ package main
import (
"fmt"
"github.com/duke-git/lancet/v2/fileutil"
"github.com/duke-git/lancet/fileutil"
)
func main() {

View File

@@ -66,6 +66,7 @@ import (
- [Rotate](#Rotate)
- [TemplateReplace](#TemplateReplace)
- [RegexMatchAllGroups](#RegexMatchAllGroups)
- [Cut](#Cut)
<div STYLE="page-break-after: always;"></div>
@@ -1537,4 +1538,38 @@ func main() {
// [john.doe@example.com john.doe example com]
// [jane.doe@example.com jane.doe example com]
}
```
### <span id="Cut">Cut</span>
<p>Splits the string at the first occurrence of separator.</p>
<b>Signature:</b>
```go
func Cut(str, sep string) (before, after string, found bool)
```
<b>example:</b>
```go
import (
"fmt"
"github.com/duke-git/lancet/strutil"
)
func main() {
str := "hello-world"
before, after, found := strutil.Cut("hello-world", "-")
fmt.Println(before)
fmt.Println(after)
fmt.Println(found)
// Output:
// hello
// world
// true
}
```

View File

@@ -66,6 +66,7 @@ import (
- [Rotate](#Rotate)
- [TemplateReplace](#TemplateReplace)
- [RegexMatchAllGroups](#RegexMatchAllGroups)
- [Cut](#Cut)
<div STYLE="page-break-after: always;"></div>
@@ -1572,4 +1573,37 @@ func main() {
// [john.doe@example.com john.doe example com]
// [jane.doe@example.com jane.doe example com]
}
```
```
### <span id="Cut">Cut</span>
<p>分割字符串。</p>
<b>函数签名:</b>
```go
func Cut(str, sep string) (before, after string, found bool)
```
<b>示例:</b>
```go
import (
"fmt"
"github.com/duke-git/lancet/strutil"
)
func main() {
str := "hello-world"
before, after, found := strutil.Cut("hello-world", "-")
fmt.Println(before)
fmt.Println(after)
fmt.Println(found)
// Output:
// hello
// world
// true
}

View File

@@ -1225,7 +1225,7 @@ func IsMasterCard(v string) bool
```go
import (
"fmt"
"github.com/duke-git/lancet/v2/validator"
"github.com/duke-git/lancet/validator"
)
func main() {

View File

@@ -17,7 +17,7 @@ import (
)
const (
MaximumCapacity = math.MaxInt>>1 + 1
MaximumCapacity = math.MaxInt32>>1 + 1
Numeral = "0123456789"
LowwerLetters = "abcdefghijklmnopqrstuvwxyz"
UpperLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

View File

@@ -360,7 +360,6 @@ func StringToBytes(str string) (b []byte) {
}
// BytesToString converts a byte slice to string without a memory allocation.
// Play: todo
func BytesToString(bytes []byte) string {
return *(*string)(unsafe.Pointer(&bytes))
}
@@ -536,15 +535,22 @@ func RemoveWhiteSpace(str string, repalceAll bool) string {
// SubInBetween return substring between the start and end position(excluded) of source string.
func SubInBetween(str string, start string, end string) string {
if _, after, ok := strings.Cut(str, start); ok {
if before, _, ok := strings.Cut(after, end); ok {
if _, after, ok := Cut(str, start); ok {
if before, _, ok := Cut(after, end); ok {
return before
}
}
return ""
}
// Cut splits the string at the first occurrence of separator.
func Cut(str, sep string) (before, after string, found bool) {
if i := strings.Index(str, sep); i >= 0 {
return str[:i], str[i+len(sep):], true
}
return str, "", false
}
// HammingDistance calculates the Hamming distance between two strings.
// The Hamming distance is the number of positions at which the corresponding symbols are different.
// This func returns an error if the input strings are of unequal lengths.

View File

@@ -668,3 +668,77 @@ func TestRegexMatchAllGroups(t *testing.T) {
assert.Equal(tt.expected, result)
}
}
func TestCut(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCut")
tests := []struct {
name string
s string
sep string
before string
after string
found bool
}{
{
name: "test with separator",
s: "hello-world",
sep: "-",
before: "hello",
after: "world",
found: true,
},
{
name: "test without separator",
s: "helloworld",
sep: "-",
before: "helloworld",
after: "",
found: false,
},
{
name: "test empty string",
s: "",
sep: "-",
before: "",
after: "",
found: false,
},
{
name: "test separator at the beginning",
s: "-hello",
sep: "-",
before: "",
after: "hello",
found: true,
},
{
name: "test separator at the end",
s: "hello-",
sep: "-",
before: "hello",
after: "",
found: true,
},
{
name: "test multiple separators",
s: "a-b-c-d",
sep: "-",
before: "a",
after: "b-c-d",
found: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
before, after, found := Cut(tt.s, tt.sep)
assert.Equal(tt.before, before)
assert.Equal(tt.after, after)
assert.Equal(tt.found, found)
})
}
}

View File

@@ -1,4 +1,5 @@
//go:build windows
// +build windows
package system