1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-04 12:52:28 +08:00

fix: fix issue #274

This commit is contained in:
dudaodong
2024-12-02 17:06:06 +08:00
parent 7fb49515ce
commit 3cd546d7f2
8 changed files with 354 additions and 377 deletions

View File

@@ -3,6 +3,7 @@ package compare
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"math/big"
"reflect" "reflect"
"time" "time"
@@ -24,6 +25,13 @@ func compareValue(operator string, left, right any) bool {
case reflect.Struct, reflect.Slice, reflect.Map: case reflect.Struct, reflect.Slice, reflect.Map:
return compareRefValue(operator, left, right, leftType.Kind()) return compareRefValue(operator, left, right, leftType.Kind())
case reflect.Ptr:
if leftVal, ok := left.(*big.Int); ok {
if rightVal, ok := right.(*big.Int); ok {
return compareBigInt(operator, leftVal, rightVal)
}
}
} }
return false return false
@@ -155,169 +163,129 @@ func compareBasicValue(operator string, leftValue, rightValue any) bool {
} }
switch leftVal := leftValue.(type) { switch leftVal := leftValue.(type) {
case json.Number: case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64:
if left, err := leftVal.Float64(); err == nil { left, err := convertor.ToBigInt(leftValue)
switch rightVal := rightValue.(type) { if err != nil {
case json.Number: return false
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 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) left, err := convertor.ToFloat(leftValue)
if err != nil { if err != nil {
return false return false
} }
switch rightVal := rightValue.(type) { right, err := convertor.ToFloat(rightValue)
case json.Number: if err != nil {
if right, err := rightVal.Float64(); 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 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
}
}
} }
return compareFloats(operator, left, right)
case string: case string:
left := leftVal left := leftVal
switch right := rightValue.(type) { switch right := rightValue.(type) {
case string: case string:
switch operator { return compareStrings(operator, left, right)
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 bool: case bool:
left := leftVal left := leftVal
switch right := rightValue.(type) { switch right := rightValue.(type) {
case bool: case bool:
switch operator { return compareBools(operator, left, right)
case equal:
if left == right {
return true
}
}
} }
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 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
}

View File

@@ -2,6 +2,7 @@ package compare
import ( import (
"encoding/json" "encoding/json"
"math/big"
"testing" "testing"
"time" "time"
@@ -12,213 +13,191 @@ func TestEqual(t *testing.T) {
t.Parallel() t.Parallel()
assert := internal.NewAssert(t, "TestEqual") assert := internal.NewAssert(t, "TestEqual")
// basic type tests := []struct {
assert.Equal(true, Equal(1, 1)) left any
assert.Equal(true, Equal(int64(1), int64(1))) right any
assert.Equal(true, Equal("a", "a")) want bool
assert.Equal(true, Equal(true, true))
assert.Equal(true, Equal([]int{1, 2, 3}, []int{1, 2, 3}))
assert.Equal(true, Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"}))
assert.Equal(false, Equal(1, 2))
assert.Equal(false, Equal(1, int64(1)))
assert.Equal(false, Equal("a", "b"))
assert.Equal(false, Equal(true, false))
assert.Equal(false, Equal([]int{1, 2}, []int{1, 2, 3}))
assert.Equal(false, Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a"}))
// time
time1 := time.Now()
time2 := time1.Add(time.Second)
time3 := time1.Add(time.Second)
assert.Equal(false, Equal(time1, time2))
assert.Equal(true, Equal(time2, time3))
// struct
st1 := struct {
A string
B string
}{ }{
A: "a", {1, 1, true},
B: "b", {int64(1), int64(1), true},
{"a", "a", true},
{true, true, true},
{[]int{1, 2, 3}, []int{1, 2, 3}, true},
{map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"}, true},
{1, 2, false},
{1, int64(1), false},
{"a", "b", false},
{true, false, false},
{[]int{1, 2}, []int{1, 2, 3}, false},
{map[int]string{1: "a", 2: "b"}, map[int]string{1: "a"}, false},
{time.Now(), time.Now(), true},
{time.Now(), time.Now().Add(time.Second), false},
{[]byte("hello"), []byte("hello"), true},
{[]byte("hello"), []byte("world"), false},
{json.Number("123"), json.Number("123"), true},
{json.Number("123"), json.Number("124"), false},
{big.NewInt(123), big.NewInt(123), true},
} }
st2 := struct { for _, tt := range tests {
A string assert.Equal(tt.want, Equal(tt.left, tt.right))
B string
}{
A: "a",
B: "b",
} }
st3 := struct {
A string
B string
}{
A: "a1",
B: "b",
}
assert.Equal(true, Equal(st1, st2))
assert.Equal(false, Equal(st1, st3))
//byte slice
bs1 := []byte("hello")
bs2 := []byte("hello")
assert.Equal(true, Equal(bs1, bs2))
// json.Number
var jsonNumber1, jsonNumber2 json.Number
json.Unmarshal([]byte(`123`), &jsonNumber1)
json.Unmarshal([]byte(`123`), &jsonNumber2)
assert.Equal(true, Equal(jsonNumber1, jsonNumber2))
} }
func TestEqualValue(t *testing.T) { func TestEqualValue(t *testing.T) {
t.Parallel() t.Parallel()
assert := internal.NewAssert(t, "TestEqualValue") assert := internal.NewAssert(t, "TestEqualValue")
assert.Equal(true, EqualValue(1, 1)) tests := []struct {
assert.Equal(true, EqualValue(int(1), int64(1))) left any
assert.Equal(true, EqualValue(1, "1")) right any
want bool
}{
{1, 1, true},
{int64(1), int64(1), true},
{"a", "a", true},
{true, true, true},
{[]int{1, 2, 3}, []int{1, 2, 3}, true},
{map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"}, true},
{1, 2, false},
{1, int64(1), true},
{"a", "b", false},
{true, false, false},
{[]int{1, 2}, []int{1, 2, 3}, false},
}
assert.Equal(false, EqualValue(1, "2")) for _, tt := range tests {
assert.Equal(tt.want, EqualValue(tt.left, tt.right))
// json.Number }
var jsonNumber1, jsonNumber2 json.Number
json.Unmarshal([]byte(`123`), &jsonNumber1)
json.Unmarshal([]byte(`123`), &jsonNumber2)
assert.Equal(true, EqualValue(jsonNumber1, 123))
} }
func TestLessThan(t *testing.T) { func TestLessThan(t *testing.T) {
t.Parallel() t.Parallel()
assert := internal.NewAssert(t, "TestLessThan") assert := internal.NewAssert(t, "TestLessThan")
assert.Equal(true, LessThan(1, 2)) tests := []struct {
assert.Equal(true, LessThan(1.1, 2.2)) left any
assert.Equal(true, LessThan("a", "b")) right any
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() for _, tt := range tests {
time2 := time1.Add(time.Second) assert.Equal(tt.want, LessThan(tt.left, tt.right))
assert.Equal(true, LessThan(time1, time2)) }
assert.Equal(false, LessThan(1, 1))
assert.Equal(false, LessThan(1, int64(1)))
bs1 := []byte("hello1")
bs2 := []byte("hello2")
assert.Equal(true, LessThan(bs1, bs2))
// json.Number
var jsonNumber1, jsonNumber2 json.Number
json.Unmarshal([]byte(`123`), &jsonNumber1)
json.Unmarshal([]byte(`124`), &jsonNumber2)
assert.Equal(true, LessThan(jsonNumber1, jsonNumber2))
} }
func TestGreaterThan(t *testing.T) { func TestGreaterThan(t *testing.T) {
t.Parallel() t.Parallel()
assert := internal.NewAssert(t, "TestGreaterThan") assert := internal.NewAssert(t, "TestGreaterThan")
assert.Equal(true, GreaterThan(2, 1)) tests := []struct {
assert.Equal(true, GreaterThan(2.2, 1.1)) left any
assert.Equal(true, GreaterThan("b", "a")) right any
want bool
}{
{2, 1, true},
{2.2, 1.1, true},
{"b", "a", true},
{time.Now().Add(time.Second), time.Now(), true},
{[]byte("hello2"), []byte("hello1"), true},
{json.Number("124"), json.Number("123"), true},
{645680099112988675, 645680099112988673, true},
{1, 1, false},
{1, int64(1), false},
}
time1 := time.Now() for _, tt := range tests {
time2 := time1.Add(time.Second) assert.Equal(tt.want, GreaterThan(tt.left, tt.right))
assert.Equal(true, GreaterThan(time2, time1)) }
assert.Equal(false, GreaterThan(1, 2))
assert.Equal(false, GreaterThan(int64(2), 1))
assert.Equal(false, GreaterThan("b", "c"))
bs1 := []byte("hello1")
bs2 := []byte("hello2")
assert.Equal(true, GreaterThan(bs2, bs1))
// json.Number
var jsonNumber1, jsonNumber2 json.Number
json.Unmarshal([]byte(`123`), &jsonNumber1)
json.Unmarshal([]byte(`124`), &jsonNumber2)
assert.Equal(true, GreaterThan(jsonNumber2, jsonNumber1))
} }
func TestLessOrEqual(t *testing.T) { func TestLessOrEqual(t *testing.T) {
t.Parallel() t.Parallel()
assert := internal.NewAssert(t, "TestLessOrEqual") assert := internal.NewAssert(t, "TestLessOrEqual")
assert.Equal(true, LessOrEqual(1, 2)) tests := []struct {
assert.Equal(true, LessOrEqual(1, 1)) left any
assert.Equal(true, LessOrEqual(1.1, 2.2)) right any
assert.Equal(true, LessOrEqual("a", "b")) want bool
}{
{1, 2, true},
{1, 1, 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},
{2, 1, false},
{1, int64(2), false},
}
time1 := time.Now() for _, tt := range tests {
time2 := time1.Add(time.Second) assert.Equal(tt.want, LessOrEqual(tt.left, tt.right))
assert.Equal(true, LessOrEqual(time1, time2)) }
assert.Equal(false, LessOrEqual(2, 1))
assert.Equal(false, LessOrEqual(1, int64(2)))
bs1 := []byte("hello1")
bs2 := []byte("hello2")
assert.Equal(true, LessOrEqual(bs1, bs2))
// json.Number
var jsonNumber1, jsonNumber2 json.Number
json.Unmarshal([]byte(`123`), &jsonNumber1)
json.Unmarshal([]byte(`124`), &jsonNumber2)
assert.Equal(true, LessOrEqual(jsonNumber1, jsonNumber2))
} }
func TestGreaterOrEqual(t *testing.T) { func TestGreaterOrEqual(t *testing.T) {
t.Parallel() t.Parallel()
assert := internal.NewAssert(t, "TestGreaterThan") assert := internal.NewAssert(t, "TestGreaterThan")
assert.Equal(true, GreaterOrEqual(2, 1)) tests := []struct {
assert.Equal(true, GreaterOrEqual(1, 1)) left any
assert.Equal(true, GreaterOrEqual(2.2, 1.1)) right any
assert.Equal(true, GreaterOrEqual("b", "b")) want bool
}{
{2, 1, true},
{1, 1, true},
{2.2, 1.1, true},
{"b", "b", true},
{time.Now().Add(time.Second), time.Now(), true},
{[]byte("hello2"), []byte("hello1"), true},
{json.Number("124"), json.Number("123"), true},
{645680099112988675, 645680099112988673, true},
{1, 2, false},
{int64(2), 1, false},
{"b", "c", false},
}
time1 := time.Now() for _, tt := range tests {
time2 := time1.Add(time.Second) assert.Equal(tt.want, GreaterOrEqual(tt.left, tt.right))
assert.Equal(true, GreaterOrEqual(time2, time1)) }
assert.Equal(false, GreaterOrEqual(1, 2))
assert.Equal(false, GreaterOrEqual(int64(2), 1))
assert.Equal(false, GreaterOrEqual("b", "c"))
bs1 := []byte("hello1")
bs2 := []byte("hello2")
assert.Equal(true, GreaterOrEqual(bs2, bs1))
// json.Number
var jsonNumber1, jsonNumber2 json.Number
json.Unmarshal([]byte(`123`), &jsonNumber1)
json.Unmarshal([]byte(`124`), &jsonNumber2)
assert.Equal(true, GreaterOrEqual(jsonNumber2, jsonNumber1))
} }
func TestInDelta(t *testing.T) { func TestInDelta(t *testing.T) {
t.Parallel() t.Parallel()
assert := internal.NewAssert(t, "TestInDelta") assert := internal.NewAssert(t, "TestInDelta")
assert.Equal(true, InDelta(1, 1, 0)) tests := []struct {
assert.Equal(false, InDelta(1, 2, 0)) left float64
right float64
delta float64
want bool
}{
{1, 1, 0, true},
{1, 2, 0, false},
{2.0 / 3.0, 0.66667, 0.001, true},
{2.0 / 3.0, 0.0, 0.001, false},
{float64(74.96) - float64(20.48), 54.48, 0, false},
{float64(74.96) - float64(20.48), 54.48, 1e-14, true},
{float64(float32(80.45)), float64(80.45), 0, false},
{float64(float32(80.45)), float64(80.45), 1e-5, true},
}
assert.Equal(true, InDelta(2.0/3.0, 0.66667, 0.001)) for _, tt := range tests {
assert.Equal(false, InDelta(2.0/3.0, 0.0, 0.001)) assert.Equal(tt.want, InDelta(tt.left, tt.right, tt.delta))
}
assert.Equal(false, InDelta(float64(74.96)-float64(20.48), 54.48, 0))
assert.Equal(true, InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14))
assert.Equal(false, InDelta(float64(float32(80.45)), float64(80.45), 0))
assert.Equal(true, InDelta(float64(float32(80.45)), float64(80.45), 1e-5))
} }

View File

@@ -20,7 +20,6 @@ import (
"strings" "strings"
"github.com/duke-git/lancet/v2/structs" "github.com/duke-git/lancet/v2/structs"
"golang.org/x/exp/constraints"
"golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform" "golang.org/x/text/transform"
) )
@@ -488,7 +487,7 @@ func ToRawUrlBase64(value any) string {
// ToBigInt converts an integer of any supported type (int, int64, uint64, etc.) to *big.Int // ToBigInt converts an integer of any supported type (int, int64, uint64, etc.) to *big.Int
// Play: todo // Play: todo
func ToBigInt[T constraints.Integer](v T) (*big.Int, error) { func ToBigInt[T any](v T) (*big.Int, error) {
result := new(big.Int) result := new(big.Int)
switch v := any(v).(type) { switch v := any(v).(type) {

View File

@@ -748,9 +748,10 @@ func TestToBigInt(t *testing.T) {
assert := internal.NewAssert(t, "TestToBigInt") assert := internal.NewAssert(t, "TestToBigInt")
tests := []struct { tests := []struct {
name string name string
input int64 input any
want *big.Int want *big.Int
hasErr bool
}{ }{
{ {
name: "int", name: "int",
@@ -759,17 +760,17 @@ func TestToBigInt(t *testing.T) {
}, },
{ {
name: "int8", name: "int8",
input: int64(int8(127)), input: int8(127),
want: big.NewInt(127), want: big.NewInt(127),
}, },
{ {
name: "int16", name: "int16",
input: int64(int16(32000)), input: int16(32000),
want: big.NewInt(32000), want: big.NewInt(32000),
}, },
{ {
name: "int32", name: "int32",
input: int64(int32(123456)), input: int32(123456),
want: big.NewInt(123456), want: big.NewInt(123456),
}, },
{ {
@@ -777,13 +778,43 @@ func TestToBigInt(t *testing.T) {
input: int64(987654321), input: int64(987654321),
want: big.NewInt(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 { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, err := ToBigInt(tt.input) got, err := ToBigInt(tt.input)
if err != nil { if (err != nil) != tt.hasErr {
t.Errorf("ToBigInt() error = %v", err) t.Errorf("ToBigInt() error = %v, hasErr %v", err, tt.hasErr)
return return
} }

View File

@@ -1,51 +1,51 @@
-----BEGIN rsa private key----- -----BEGIN rsa private key-----
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
-----END rsa private key----- -----END rsa private key-----

View File

@@ -1,14 +1,14 @@
-----BEGIN rsa public key----- -----BEGIN rsa public key-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxyEWKk4SEjsNfEJ0pBH7 MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtgIZs9XNOtSKkDhGqXu7
dLaWGuHVwQn45oOG4Bo5XwQhpgTm1TD+OgFg69BSeJduGtUExbcWEk8SAWgaSMk9 kEM4Lwr+A3P+Zc5qQ2hdIj95kp1S2xbk7yvXfYSK7vP1u+dW/X5u1iLEErKhm2Gv
2y8L/33cncabwDhLzMNOk1NBie9ScUENh8zVq5oJF6B16Ijk6gbhAuQ2KExA//FN 5N7sZfYT33v/w+R3VnceNBr+hAuPUihSWCWp1auywRvELpz83SgOEHt6IyRtcFLm
wU/AeG+nY5/mXMAqnxkl/INJd+UCRoEOZ+fvWDVyIS0zqb1XIQoi+rGVfcpaFX+O VgcW8Ii2oAkD+0KrXeX2h62aqWf89joPlNwgZtbCaz9ROUhZRvsI6B7cUnqOLcoF
+wPyHbbgRVVQjgimSq1DRSFHX19vRNQNWnNR0x01PsyTsSjNGTOKRInfupQEB17B b6VKZq0wfn1z/QOapN62dy7gcYhinC+u5Y5cWcycBj4y5xXArlUKDOLGi7yBt8xv
7EmOFU8NV7+PIoIlKSnSkl6jhpMPZd+Kd55ldlnybOLCFE4e+tzbCIG9pvI+wEDl P5eM5EJ2G8y8yMbu1v0/4LLohkuqiNGOfpx3nfgeq3WthbPTkCyMxro/bObJWG9J
Ks/q4EUS8a4vJzpSc+WPAzohIkG6NTN6mh0V86dfexk+5lrnZ+zOb47769pOJy2N E9fAj/ex1eU/f+LfZt73nziBxGx9R7kvF5+UkbtSrOSSwKHSl0Y+593q+rT7sWfu
nTMwUd6MMJDe5rm2coMSTNI/8uD3vHiQuh1Sbc/ognbk0kgI8/8mqjmy/C3nCbB4 RYiUBYEEeeuyo245hIQDkpLqtZg1+6tvh7FFPmdKNQy65JAyRCP/MCwsuuo4KgH2
hzwdYrv04HOT3WIL7rWWmWYkwbO+JitXFaFka0/2dQiA4P+po3Q4JipMEskG7SlW 3Bml+EZbEz2mBk1BdBKfxO7j4QsWFXJ+s1NOEERcTddKIz6uB2K/rvvi8vxY2blB
NZAMvpuU5OnRW5d40sJz4vsEVwzOBoPWVupXplXlZ6ipBGySovL8LJGUI6CF6qfw pZFjSXFbTk6i5+uNqF5WbgDxobZ3vkHWog6AgglyVuhjtMacq9xnUnTNuTGuiZWh
G8gCjojkz1Y44gxyR/Zt0idqZkelTBReIHiYK5r3Ql4OiGfCmMhDD+PQA3FlD0gN Y3LXALV9a3JyVwFWzn8VkBdm9Vch6NA49czwkRXZghvexxtUoduAwheVoYn281CP
C48ZLXknzEfvOnzqkETx3YMCAwEAAQ== +AMTYgbhocnIOfHqWDo3pAkCAwEAAQ==
-----END rsa public key----- -----END rsa public key-----

View File

@@ -1153,12 +1153,12 @@ func main() {
### <span id="ToBigInt">ToBigInt</span> ### <span id="ToBigInt">ToBigInt</span>
<p>值转换为bigInt。</p> <p>将整数值转换为bigInt。</p>
<b>函数签名:<span style="float:right;display:inline-block;">[运行](todo)</span></b> <b>函数签名:<span style="float:right;display:inline-block;">[运行](todo)</span></b>
```go ```go
func ToBigInt[T constraints.Integer](v T) (*big.Int, error) func ToBigInt[T any](v T) (*big.Int, error)
``` ```
<b>示例:</b> <b>示例:</b>

View File

@@ -1126,7 +1126,7 @@ func main() {
<b>Signature:<span style="float:right;display:inline-block;">[Run](todo)</span></b> <b>Signature:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
```go ```go
func ToBigInt[T constraints.Integer](v T) (*big.Int, error) func ToBigInt[T any](v T) (*big.Int, error)
``` ```
<b>Example:</b> <b>Example:</b>