Ciąg Golang do uint

Nov 14 2020

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

ShudiptaSharma Nov 14 2020 at 15:03

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.

1 Omkar76 Nov 14 2020 at 15:01

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?