Xetius
Xetius

Reputation: 46794

golang Converting math.MinInt64 string to int fails

given the following function:

func convertValue(contents string) (int, error) {
    return strconv.Atoi(contents)
}

when I run the following test

var convertValues = []struct {
    contents string
    value int
}{
    {"9223372036854775807", math.MaxInt64},
    {"−9223372036854775808", math.MinInt64},
}

func TestConvertValue(t *testing.T) {
    for _, values := range convertValues {
        value, err := convertValue(values.contents)
        if err != nil {
            t.Error("Expecting", values.value, "but got error", err.Error())
        }

        if value != values.value {
            t.Error("Expecting ", values.value, ", but got ", value)
        }
    }
}

it works for MaxInt64, but not for MinInt64. I'm running this on a MacBookPro, so it's running in 64bit. I have double checked this with the following

func TestIntSize(t *testing.T) {
    const PtrSize = 32 << uintptr(^uintptr(0)>>63)
    fmt.Println(runtime.GOOS, runtime.GOARCH)
    fmt.Println(strconv.IntSize, PtrSize)
}

and it returned

darwin amd64
64 64

What am I doing wrong?

Upvotes: 0

Views: 295

Answers (1)

Chris Cherry
Chris Cherry

Reputation: 28554

https://play.golang.org/p/FtytYJkHSc

Switching to strconv.ParseInt and explicitly using int64 as the type seemed to help. I also had an issue with the dash character in your MinInt64 string, that might just be on my end, but worth checking and making sure it is the basic ASCII character not some kind of Unicode dash.

Upvotes: 1

Related Questions