当前位置: 首页 > news >正文

golang 如何生成唯一的 UUID

  • 推荐学习文档
    • golang应用级os框架,欢迎star
    • golang应用级os框架使用案例,欢迎star
    • 案例:基于golang开发的一款超有个性的旅游计划app经历
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • 想学习更多golang知识,这里有免费的golang学习笔记专栏

文章目录

    • UUID 简介
    • Go 标准库中的实现
    • 使用第三方库github.com/google/uuid
    • 总结

UUID 简介

UUID(通用唯一识别码,Universally Unique Identifier)是一种由数字和字母组成的 128 位标识符。它的目的是在空间和时间上提供全球唯一的标识。UUID 在分布式系统、数据库、微服务架构等众多场景中有着广泛的应用,用于唯一标识资源,如数据库记录、消息、网络节点等。

Go 标准库中的实现

Go 语言的标准库中没有直接提供生成 UUID 的功能,但可以通过组合使用标准库中的功能来生成符合 UUID 标准的唯一标识符。一种常见的方法是使用 crypto/rand 库来生成随机数,并按照 UUID 的格式进行组装。
以下是一个示例代码:

package mainimport ("crypto/rand""fmt"
)func generateUUID() string {uuid := make([]byte, 16)_, err := rand.Read(uuid)if err!= nil {panic(err)}// 按照UUID的格式设置版本号(这里设置为版本4,随机UUID)uuid[6] = (uuid[6] & 0x0f) | 0x40// 设置变体(按照RFC 4122标准)uuid[8] = (uuid[8] & 0x3f) | 0x80return fmt.Sprintf("%x-%x-%x-%x-%x", uuid[0:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:])
}

在这个代码中:

  • 首先创建了一个长度为 16 字节的字节切片 uuid,这是 UUID 的原始数据表示形式。
  • 使用 rand.Read 函数从加密安全的随机源中读取随机字节填充到 uuid 切片中。如果读取失败,将会发生panic。
  • 然后按照 UUID 版本 4(随机生成的 UUID)的标准设置版本号。将字节 6 的高四位设置为 0100(十六进制的 0x40),表示版本 4。
  • 接着设置变体,将字节 8 的高两位设置为 10(十六进制的 0x80),以符合 RFC 4122 标准中定义的变体。

使用第三方库github.com/google/uuid

除了自己手动实现,Go 社区中也有一些优秀的第三方库可以方便地生成 UUID。其中,github.com/google/uuid 是一个广泛使用的库。

  • 安装
    首先需要安装这个库,可以使用 go get 命令:
     go get github.com/google/uuid
  • 使用示例
    以下是使用这个库生成 UUID 的示例代码:
     package mainimport ("fmt""github.com/google/uuid")func main() {id, err := uuid.NewUUID()if err!= nil {panic(err)}fmt.Println(id.String())}

在这个示例中:

  • 首先导入了 github.com/google/uuid 库。
  • 然后使用 uuid.NewUUID 函数生成一个新的 UUID 对象。如果生成过程中出现错误,将会panic。
  • 最后调用 id.String 方法将 UUID 对象转换为字符串形式并打印出来。

总结

在 Go 语言中,可以通过标准库组合的方式或者使用第三方库来生成唯一的 UUID。如果对代码的简洁性和功能的完整性有较高要求,建议使用 github.com/google/uuid 这样的成熟第三方库;如果想要深入理解 UUID 的生成原理并且对代码体积有严格控制,手动使用标准库实现也是一个不错的选择。无论是哪种方式,生成的 UUID 都可以在各种需要唯一标识符的场景中发挥重要作用,确保数据的唯一性和可识别性。

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

关注我看更多有意思的文章哦!👉👉

相关文章:

  • 一个OpenHarmony rk3568编译问题
  • 品牌增长新引擎:TikTok达人内容营销策略解析
  • 6--苍穹外卖-SpringBoot项目中菜品管理 详解(二)
  • spring boot 项目中redis的使用,key=value值 如何用命令行来查询并设置值。
  • Python编码系列—Python访问者模式:为对象结构添加新功能的艺术
  • 如何快速免费搭建自己的Docker私有镜像源来解决Docker无法拉取镜像的问题(搭建私有镜像源解决群晖Docker获取注册表失败的问题)
  • vue3 商城系统中的 sku 功能的实现
  • 优秀在线 notion 头像制作工具分享-Notion Avatar Maker
  • 35 | 实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”
  • Chromium 设置页面打开系统代理源码分析c++
  • C语言 | Leetcode C语言题解之第443题压缩字符串
  • 《中国电子报》报道: 安宝特AR为产线作业者的“秘密武器
  • 桥接模式和NET模式的区别
  • 今年Java回暖了吗
  • Python模拟真人鼠标轨迹算法
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Brief introduction of how to 'Call, Apply and Bind'
  • Docker入门(二) - Dockerfile
  • Fabric架构演变之路
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • LeetCode29.两数相除 JavaScript
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于for循环的简单归纳
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 我建了一个叫Hello World的项目
  • 学习笔记:对象,原型和继承(1)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 整理一些计算机基础知识!
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #每天一道面试题# 什么是MySQL的回表查询
  • #微信小程序:微信小程序常见的配置传值
  • (7)STL算法之交换赋值
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (九十四)函数和二维数组
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)Linux整合apache和tomcat构建Web服务器
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • (自用)gtest单元测试
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .gitignore文件_Git:.gitignore
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .Net接口调试与案例
  • .NET中统一的存储过程调用方法(收藏)
  • .sh 的运行