Stringa Golang per uint

Nov 14 2020

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

ShudiptaSharma Nov 14 2020 at 15:03

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.

1 Omkar76 Nov 14 2020 at 15:01

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?