สตริง Golang เป็น uint

Nov 14 2020

ในโครงการของฉัน ID ได้รับการออกแบบให้เป็นเกล็ดหิมะ ส่วนหน้าส่งสตริงมาให้ฉันและที่เก็บฐานข้อมูลก็ใหญ่ ซึ่งหมายความว่าก่อนที่ฉันจะเก็บมันจำเป็นต้องแปลงเป็น uint ก่อน ช่วยบอกหน่อยว่าต้องทำอย่างไร? ข้อมูลสาธิต:

m := "156343853366906880"

รหัสของฉัน:
u, _ := strconv.ParseUint(m, 0, 19)

ผลลัพธ์ที่คาดหวังมีความแม่นยำและจะไม่สูญเสียความแม่นยำ

คำตอบ

ShudiptaSharma Nov 14 2020 at 15:03

SnowflakeIDเป็นรหัสเฉพาะ 64 บิตตามเวลา เนื่องจากคุณต้องแปลงสตริงเป็นตัวเลข 64 บิตstrconv.ParseUint()จึงค่อนข้างดี ดูอ้างอิงที่ParseUint

ในโค้ดของคุณคุณใช้ขนาด 19 บิต อย่าผสมกับจำนวนหลักในจำนวนเต็ม (ไม่ได้ลงชื่อ) แทนด้วยสตริงจากส่วนหน้า

สำหรับการแปลง SnowflakeID (สตริง) 64 บิตเป็นจำนวนเต็ม 64 บิตที่ไม่ได้ลงชื่อให้ใช้ 64 เป็น bitSize arg

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

และอย่าพยายามเพิกเฉยต่อข้อผิดพลาดเมื่อมันสำคัญจริงๆ

1 Omkar76 Nov 14 2020 at 15:01

พารามิเตอร์ที่สามของstrconv.parseUint()คือbitSize. 19 156343853366906880บิตไม่เพียงพอที่จะแสดงให้เห็นถึงจำนวน ดังนั้นวิธีการส่งกลับข้อผิดพลาด (ซึ่งคุณเพิกเฉยโดยกำหนดให้_)

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

2 ^ 19 - 1 = 524287 เป็นจำนวนที่ไม่ได้ลงนามที่ใหญ่ที่สุดที่สามารถแทนด้วย 19 บิต

ผ่าน 64 เป็น bitSize:

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

หากตัวเลขของคุณมากกว่าการuint64ใช้งานbig.Int:

string to big Int ใน Go?