Golang-Saite zu uint
In meinem Projekt ist ID als Schneeflocke ausgelegt. Das Frontend übergibt mir eine Zeichenfolge, und der Datenbankspeicher ist bigint. Dies bedeutet, dass es vor dem Speichern in uint konvertiert werden muss. Bitte sag mir was zu tun ist? Demo-Daten:
m := "156343853366906880"
Mein Code:
u, _ := strconv.ParseUint(m, 0, 19)
Die erwarteten Ergebnisse sind genau und verlieren nicht an Genauigkeit
Antworten
SnowflakeID ist eine zeitbasierte 64-Bit-ID. Da Sie String in eine 64-Bit-Zahl konvertieren müssen, strconv.ParseUint()ist das ganz gut. Siehe die Referenz bei ParseUint .
In Ihrem Code haben Sie 19 als Bitgröße verwendet. Mischen Sie es nicht mit der Anzahl der Ziffern in der Ganzzahl (ohne Vorzeichen), die durch die Zeichenfolge vom Frontend dargestellt wird.
Verwenden Sie 64 als bitSize-Argument, um eine 64-Bit-SnowflakeID (Zeichenfolge) in eine 64-Bit-Ganzzahl ohne Vorzeichen zu konvertieren.
U, err := strvonv.ParseUint(s, 0, 64)
if err != nil {
// handle error...
}
Versuchen Sie auch nicht, Fehler zu ignorieren, wenn es wirklich darauf ankommt.
Dritter Parameter von strconv.parseUint()ist bitSize. 19 Bits reichen nicht aus, um die Zahl darzustellen 156343853366906880. Die Methode gibt also einen Fehler zurück. (was Sie ignorieren, indem Sie es zuweisen _)
m := "156343853366906880"
_, err := strconv.ParseUint(m, 0, 19)
fmt.Println(err)
//strconv.ParseUint: parsing "156343853366906880": value out of range 524287
2 ^ 19 - 1 = 524287 ist die größte vorzeichenlose Zahl, die mit 19 Bit dargestellt werden kann.
Übergeben Sie 64 als bitSize:
m := "156343853366906880"
u, err := strconv.ParseUint(m, 0, 64)
if err == nil {
fmt.Print(u)
//156343853366906880
}
Wenn Ihre Nummer größer als uint64verwendet wird big.Int:
String zu groß Int in Go?