Ciąg Golang do uint
W moim projekcie ID ma postać płatka śniegu. Frontend przekazuje mi ciąg, a magazyn bazy danych to bigint. Oznacza to, że zanim go zapiszę, należy go przekonwertować na uint. Proszę, powiedz mi co robić? dane demo:
m := "156343853366906880"
mój kod:
u, _ := strconv.ParseUint(m, 0, 19)
Oczekiwane wyniki są dokładne i nie utracą dokładności
Odpowiedzi
SnowflakeID to 64-bitowy unikalny identyfikator oparty na czasie. Ponieważ musisz przekonwertować ciąg na liczbę 64-bitową, strconv.ParseUint()jest całkiem niezły. Zobacz odniesienie w ParseUint .
W swoim kodzie użyłeś 19 jako rozmiaru bitowego. Nie mieszaj go z liczbą cyfr w liczbie całkowitej (bez znaku) reprezentowanej przez ciąg z interfejsu użytkownika.
Aby przekonwertować 64-bitowy identyfikator SnowflakeID (ciąg) na 64-bitową liczbę całkowitą bez znaku, użyj 64 jako argumentu bitSize.
U, err := strvonv.ParseUint(s, 0, 64)
if err != nil {
// handle error...
}
Nie próbuj też ignorować błędu, gdy ma to naprawdę znaczenie.
Trzeci parametr strconv.parseUint()jest bitSize. 19 bitów nie wystarcza do reprezentacji liczby 156343853366906880. Więc metoda zwraca błąd. (który ignorujesz, przypisując go _)
m := "156343853366906880"
_, err := strconv.ParseUint(m, 0, 19)
fmt.Println(err)
//strconv.ParseUint: parsing "156343853366906880": value out of range 524287
2 ^ 19 - 1 = 524287 to największa liczba bez znaku, którą można przedstawić za pomocą 19 bitów.
Przekaż 64 jako bit Rozmiar:
m := "156343853366906880"
u, err := strconv.ParseUint(m, 0, 64)
if err == nil {
fmt.Print(u)
//156343853366906880
}
Jeśli twój numer będzie większy niż uint64użyj big.Int:
ciąg do dużego Int w Go?