Golang string ke uint

Nov 14 2020

Dalam proyek saya, ID dirancang sebagai kepingan salju. Bagian depan memberikan string kepada saya, dan penyimpanan database adalah bigint. Artinya sebelum saya menyimpannya, perlu dikonversi ke uint. Tolong beritahu saya apa yang harus saya lakukan? data demo:

m := "156343853366906880"

kode saya:
u, _ := strconv.ParseUint(m, 0, 19)

Hasil yang diharapkan akurat dan tidak akan kehilangan akurasi

Jawaban

ShudiptaSharma Nov 14 2020 at 15:03

SnowflakeID adalah id unik 64-bit berbasis waktu. Karena Anda perlu mengubah string ke angka 64-bit, strconv.ParseUint()itu cukup bagus. Lihat, referensi di ParseUint .

Dalam kode Anda, Anda menggunakan 19 sebagai ukuran bit. Jangan mencampurkannya dengan jumlah digit dalam integer (unsigned) yang diwakili oleh string dari frontend.

Untuk mengonversi SnowflakeID 64-bit (string) menjadi 64-bit unsigned integer, gunakan 64 sebagai bitSize arg.

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

Juga jangan mencoba untuk mengabaikan kesalahan, jika memang penting.

1 Omkar76 Nov 14 2020 at 15:01

Parameter ketiga strconv.parseUint()adalah bitSize. 19 bit tidak cukup untuk mewakili angka 156343853366906880. Jadi metode ini mengembalikan kesalahan. (yang Anda abaikan dengan menetapkannya ke _)

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

2 ^ 19 - 1 = 524287 adalah bilangan unsigned terbesar yang dapat direpresentasikan dengan 19 bit.

Lulus 64 sebagai bitSize:

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

Jika nomor Anda akan lebih besar dari uint64penggunaan big.Int:

string menjadi Int besar di Go?