Строка голанга для uint
В моем проекте ID оформлен в виде снежинки. Внешний интерфейс передает мне строку, а хранилище базы данных - bigint. Это означает, что прежде чем я сохраню его, его нужно преобразовать в uint. Подскажите пожалуйста что делать? демонстрационные данные:
m := "156343853366906880"
мой код:
u, _ := strconv.ParseUint(m, 0, 19)
Ожидаемые результаты точны и не потеряют точности
Ответы
SnowflakeID - это 64-битный уникальный идентификатор на основе времени. Поскольку вам нужно преобразовать строку в 64-битное число, strconv.ParseUint()это неплохо. См. Ссылку на ParseUint .
В вашем коде вы использовали размер 19 в битах. Не смешивайте его с количеством цифр в целом числе (без знака), представленном строкой из внешнего интерфейса.
Для преобразования 64-битного SnowflakeID (строки) в 64-битное целое число без знака используйте 64 в качестве аргумента bitSize.
U, err := strvonv.ParseUint(s, 0, 64)
if err != nil {
// handle error...
}
Также не пытайтесь игнорировать ошибку, когда это действительно важно.
Третий параметр 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?