Строка голанга для uint

Nov 14 2020

В моем проекте ID оформлен в виде снежинки. Внешний интерфейс передает мне строку, а хранилище базы данных - bigint. Это означает, что прежде чем я сохраню его, его нужно преобразовать в uint. Подскажите пожалуйста что делать? демонстрационные данные:

m := "156343853366906880"

мой код:
u, _ := strconv.ParseUint(m, 0, 19)

Ожидаемые результаты точны и не потеряют точности

Ответы

ShudiptaSharma Nov 14 2020 at 15:03

SnowflakeID - это 64-битный уникальный идентификатор на основе времени. Поскольку вам нужно преобразовать строку в 64-битное число, strconv.ParseUint()это неплохо. См. Ссылку на ParseUint .

В вашем коде вы использовали размер 19 в битах. Не смешивайте его с количеством цифр в целом числе (без знака), представленном строкой из внешнего интерфейса.

Для преобразования 64-битного SnowflakeID (строки) в 64-битное целое число без знака используйте 64 в качестве аргумента bitSize.

U, err := strvonv.ParseUint(s, 0, 64)
if err != nil {
    // handle error... 
}

Также не пытайтесь игнорировать ошибку, когда это действительно важно.

1 Omkar76 Nov 14 2020 at 15:01

Третий параметр strconv.parseUint()есть bitSize. 19 бит недостаточно для представления числа 156343853366906880. Значит, метод возвращает ошибку. (который вы игнорируете, назначая его _)

m := "156343853366906880"
_, err := strconv.ParseUint(m, 0, 19)
fmt.Println(err)
//strconv.ParseUint: parsing "156343853366906880": value out of range 524287

2 ^ 19 - 1 = 524287 - наибольшее число без знака, которое может быть представлено 19 битами.

Передайте 64 как bitSize:

m := "156343853366906880"
u, err := strconv.ParseUint(m, 0, 64)
if err == nil {
    fmt.Print(u)
    //156343853366906880
}

Если ваше число будет больше, чем uint64используйте big.Int:

строка для большого Int в Go?