Title: Fix ToUint64E function in cast library for Go

Detail:
The ToUint6E4 function in the Go cast library was fixed to correctly handle strings that overflow the maximum value of int64.

Previously, the function incorrectly returned zero for these input values because it was using strconv.ParseInt internally, which doesn't handle values greater than the max int64. The fix replaces the use of strconv.ParseInt with strconv.ParseUint.
This commit is contained in:
skyjerry 2024-03-12 22:17:08 +08:00
parent 48ddde5701
commit 6e9731d50e
2 changed files with 8 additions and 2 deletions

View File

@ -111,6 +111,12 @@ func TestToUintE(t *testing.T) {
func TestToUint64E(t *testing.T) { func TestToUint64E(t *testing.T) {
tests := createNumberTestSteps(uint64(0), uint64(1), uint64(8), uint64(0), uint64(8), uint64(8)) tests := createNumberTestSteps(uint64(0), uint64(1), uint64(8), uint64(0), uint64(8), uint64(8))
// Maximum value of uint64
tests = append(tests,
testStep{"18446744073709551615", uint64(18446744073709551615), false},
testStep{"18446744073709551616", uint64(0), true},
)
runNumberTest( runNumberTest(
qt.New(t), qt.New(t),
tests, tests,

View File

@ -598,12 +598,12 @@ func ToUint64E(i interface{}) (uint64, error) {
switch s := i.(type) { switch s := i.(type) {
case string: case string:
v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) v, err := strconv.ParseUint(trimZeroDecimal(s), 0, 0)
if err == nil { if err == nil {
if v < 0 { if v < 0 {
return 0, errNegativeNotAllowed return 0, errNegativeNotAllowed
} }
return uint64(v), nil return v, nil
} }
return 0, fmt.Errorf("unable to cast %#v of type %T to uint64", i, i) return 0, fmt.Errorf("unable to cast %#v of type %T to uint64", i, i)
case json.Number: case json.Number: