Stringa Golang per uint
Nel mio progetto, ID è progettato come fiocco di neve. Il front-end mi passa una stringa e l'archiviazione del database è bigint. Ciò significa che prima di archiviarlo, deve essere convertito in uint. Per favore dimmi cosa fare? dati demo:
m := "156343853366906880"
il mio codice:
u, _ := strconv.ParseUint(m, 0, 19)
I risultati attesi sono accurati e non perderanno precisione
Risposte
SnowflakeID è un ID univoco a 64 bit basato sul tempo. Poiché è necessario convertire una stringa in un numero a 64 bit, strconv.ParseUint()è abbastanza buono. Vedi, il riferimento a ParseUint .
Nel tuo codice hai usato 19 come dimensione in bit. Non mescolarlo con il numero di cifre dell'intero (senza segno) rappresentato dalla stringa dal frontend.
Per convertire un SnowflakeID a 64 bit (stringa) in un intero senza segno a 64 bit, usa 64 come bitSize arg.
U, err := strvonv.ParseUint(s, 0, 64)
if err != nil {
// handle error...
}
Inoltre, non cercare di ignorare l'errore, quando è davvero importante.
Terzo parametro di strconv.parseUint()is bitSize. 19 bit non sono sufficienti per rappresentare il numero 156343853366906880. Quindi il metodo restituisce un errore. (che stai ignorando assegnandolo a _)
m := "156343853366906880"
_, err := strconv.ParseUint(m, 0, 19)
fmt.Println(err)
//strconv.ParseUint: parsing "156343853366906880": value out of range 524287
2 ^ 19 - 1 = 524287 è il numero senza segno più grande che può essere rappresentato con 19 bit.
Passa 64 come bit Dimensioni:
m := "156343853366906880"
u, err := strconv.ParseUint(m, 0, 64)
if err == nil {
fmt.Print(u)
//156343853366906880
}
Se il tuo numero sta per essere maggiore di uint64utilizzare big.Int:
stringa al grande Int in Go?