Golang string à uint

Nov 14 2020

Dans mon projet, ID est conçu comme snowflakeid. Le frontal me transmet une chaîne et le stockage de la base de données est bigint. Cela signifie qu'avant de le stocker, il doit être converti en uint. S'il vous plaît dites-moi ce qu'il faut faire? données de démonstration:

m := "156343853366906880"

mon code:
u, _ := strconv.ParseUint(m, 0, 19)

Les résultats attendus sont précis et ne perdront pas de précision

Réponses

ShudiptaSharma Nov 14 2020 at 15:03

SnowflakeID est un identifiant unique 64 bits basé sur le temps. Puisque vous devez convertir une chaîne en un nombre 64 bits, strconv.ParseUint()c'est assez bon. Voir, la référence à ParseUint .

Dans votre code, vous avez utilisé 19 comme taille de bits. Ne le mélangez pas avec le nombre de chiffres dans l'entier (non signé) représenté par la chaîne du frontend.

Pour convertir un SnowflakeID (chaîne) 64 bits en un entier non signé 64 bits, utilisez 64 comme argument bitSize.

U, err := strvonv.ParseUint(s, 0, 64)
if err != nil {
    // handle error... 
}

N'essayez pas non plus d'ignorer l'erreur, quand cela compte vraiment.

1 Omkar76 Nov 14 2020 at 15:01

Le troisième paramètre de strconv.parseUint()est bitSize. 19 bits ne sont pas suffisants pour représenter le nombre 156343853366906880. La méthode renvoie donc une erreur. (que vous ignorez en l'attribuant _)

m := "156343853366906880"
_, err := strconv.ParseUint(m, 0, 19)
fmt.Println(err)
//strconv.ParseUint: parsing "156343853366906880": value out of range 524287

2 ^ 19 - 1 = 524287 est le plus grand nombre non signé pouvant être représenté avec 19 bits.

Passez 64 comme bitSize:

m := "156343853366906880"
u, err := strconv.ParseUint(m, 0, 64)
if err == nil {
    fmt.Print(u)
    //156343853366906880
}

Si votre nombre est supérieur à l' uint64utilisation big.Int:

chaîne en gros Int dans Go?