สตริง Golang เป็น uint
ในโครงการของฉัน ID ได้รับการออกแบบให้เป็นเกล็ดหิมะ ส่วนหน้าส่งสตริงมาให้ฉันและที่เก็บฐานข้อมูลก็ใหญ่ ซึ่งหมายความว่าก่อนที่ฉันจะเก็บมันจำเป็นต้องแปลงเป็น uint ก่อน ช่วยบอกหน่อยว่าต้องทำอย่างไร? ข้อมูลสาธิต:
m := "156343853366906880"
รหัสของฉัน:
u, _ := strconv.ParseUint(m, 0, 19)
ผลลัพธ์ที่คาดหวังมีความแม่นยำและจะไม่สูญเสียความแม่นยำ
คำตอบ
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...
}
และอย่าพยายามเพิกเฉยต่อข้อผิดพลาดเมื่อมันสำคัญจริงๆ
พารามิเตอร์ที่สามของ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?