- 博客(48)
- 收藏
- 关注
原创 Go 语言 UUID 库 google/uuid 源码解析:UUID version7 的实现
本篇文章介绍 UUID 的推荐使用版本 UUIDv7 的特性与结构,并对 google/uuid 中实现 UUIDv7 的源代码进行解析。通过此篇文章,你将会对 UUIDv7 产生更深刻的认识。
2024-07-15 16:04:43 1524 1
原创 对比 UUIDv1 和 UUIDv6
本文对比 UUID 版本1 和 UUID 版本6,以展示 UUID 版本6 的变化和优势,并启示我们正确使用 UUID 版本6 代替 UUID 版本1 作为数据库字段。
2024-07-13 21:35:40 593
原创 Go 语言 UUID 库 google/uuid 源码解析:UUID version4 的实现
此篇文章通过对 google/uuid 源码进行解析,介绍 UUID 版本4的具体实现。通过这篇文章,你可以充分理解 UUID 版本4的实现原理。
2024-07-09 20:31:24 2720
原创 Go 语言 UUID 库 google/uuid 源码解析:UUID version1 的实现
此篇文章探究 RFC 4122 定义的 UUID 标准版本1的 Go 语言实现。通过这篇文章你可以清晰得了解到 UUID version 1 的详细结构与具体实现。
2024-07-06 18:52:25 879
原创 Go 语言 UUID 库 google/uuid 源码解析:时钟信息
此文章对 Go 语言 UUID 库 google/uuid 进行源码解析,通过解析源码学习 RFC 4122 定义的时间戳和时钟序列的实现。
2024-07-05 22:55:23 984
原创 唯一ID:UUID 介绍与 google/uuid 库生成 UUID
UUID 即通用唯一识别码,是一种用于计算机系统中以确保全局唯一性的标识符。其标准定义于 RFC 4122 文档中。标准形式包含 32 个 16 进制数字,以连字符切割为五组,格式为 8-4-4-4-12,总共 36 个字符。(形如, d169aa7f-4a6e-4ee2-b073-8e46e29c72f3)
2024-07-01 22:39:48 517
原创 二分查找:自定义 upper_bound、lower_bound
此篇文章介绍返回索引的 upper_bound 和 lower_bound 的 C++ 实现。
2024-06-29 21:14:26 324
原创 二分查找:C++ 库函数 upper_bound、lower_bound 和 binary_search
二分查找是一种在有序数组中查找特定元素的高效算法。在二分查找中,upper_bound、lower_bound 和 binary_search 是三个常用的操作,C++标准库也提供了原生 API,它们都利用了二分查找,但用于解决略微不同的问题。
2024-06-29 21:11:17 408
原创 go get 和 go mod tidy 的区别
go get 和 go mod tidy 的效果很相近,它们都可以下载需要的依赖项并更新 go.mod 和 go sum 所以在使用时经常会发生混淆...
2024-06-27 09:33:40 1022
原创 安装不依赖于 Zookeeper 的单节点 Kafka
此篇文章介绍如何使用 Docker 安装不依赖于 Zookeeper 的单节点 Kafka 3.7.0。
2024-06-26 18:28:05 625
原创 Gorm 实践:使用 gorm.ErrRecordNotFound 判断元组是否存在
Gorm 提供了很多错误类型给我们使用,今天我们介绍较为常见的 gorm.ErrRecordNotFound,我们将用其实现较为常见的存在性判断逻辑。之所以常见,是因为我们常需要使用存在性判断,来避免使用不存在的结果的结果集或重复插入数据行。
2024-06-24 21:31:17 1130
原创 redis-benchmark 基准测试
我们可以通过 redis 自带工具 redis-benchmark 来对 redis 服务器进行性能测试。
2024-06-10 13:06:29 563
原创 使用 ISIC 快速申请 JetBrain 学生免费产品
此篇文章适合急需通过学生优惠使用 JetBrain 产品并且愿意花费 50 (申请国际电子学生证 ISIC 需要 50)的学生。需要等待时间1-3天,主要是等待 ISIC 的时间,只要 ISIC 发放 ISIC name 和 ISIC ID,将其填写到 JetBrain 的申请中,按 JetBrain 指定步骤完成即可,不需要人工审核。
2024-06-07 22:28:10 763
原创 C++构造器设计模式
构造器模式可以简化复杂对象或一系列对象的构造过程,从而单独定义构成该复杂对象的各个组件的构建方法。这篇文章只讲解较为简单的构造器的创建。创建一个构造器我们得了解如何实现流式调用以及如何关闭外界的访问权对构造函数的访问权限。
2024-06-06 19:56:57 460
原创 详解 Protobuf 在 C++ 下 Message、enum、Service 的使用
这篇文章主要目的是介绍Protobuf的常用知识,包括前置声明,message,service,enum 等。
2024-06-03 14:10:33 1746
原创 Zookeeper 最新稳定版本 3.8.4 服务安装与原生 C 静态库编译
注意: /path 代表 apache-zookeeper-3.8.4-bin.tar.gz 的所在的文件夹路径,请在进行以下步骤时替换为 apache-zookeeper-3.8.4-bin.tar.gz 在你系统中的目录(或者直接切换到该目录下,并省略前缀 /path/)。(*为占位符,可以是 so、so.2等)这将在 apache-zookeeper-3.8.4-bin/zookeeper-client/zookeeper-client-c 下创建一个名为 generated 的目录。
2024-06-02 23:44:24 1580 1
原创 里氏替换原则经典反例:正方形不是长方形
很明显,在接口 process 中 Square 不能替换 Rectangle,因为当 Square 替换 Rectangle 作为参数时,程序发生了异常,出现了预期之外的结果。所以,为了确保里氏替换原则成立,我们应该取消 Square 对 Rectangle的继承,重新给 Square 和 Rectangle 设计一个更高层的抽象,如 Shape,Shape 中有一个 Square 和 Rectangle 共有的属性 area,然后让 Square 和 Rectangle 都继承 Shape。
2024-06-02 21:32:17 1062
原创 从C++示例理解开闭原则
可以看出当我们有新的需求时,必须要对 ProductFilter 类进行修改,并没有遵循开闭原则,所以我们希望重新设计使这个程序满足开闭原则,重构主要用到 template 模版编程。这里的类型 T 可以由我们自由地指定,我们可以指定为类型 Product 也可以指定为其他类型,这就意味着,这个规范将不再局限于 Product,我们可以在任何其他类型中使用它。开闭原则要求我们在编写代码时,尽量不去修改原先的代码,当出现新的业务需求时,应该通过增加新代码的形式扩展业务而不是对原代码进行修改。
2024-06-01 19:54:07 689
原创 如何使用基类指针迭代派生类对象
如果我们想使用基类指针迭代指向的派生类对象,我们需要在基类中声明返回迭代器的虚函数begin和end,然后在派生类中实现begin和end,这样我们就可以使用基类指针指向派生类后使用其迭代器了。
2024-06-01 10:56:15 249
原创 尽量以const、inline替换 #define
中给出的遵循这个条款大概理由如下:#define的宏在预处理阶段就已经被替换掉,所以编译器可能看不到宏的存在,只看到被替换的内容,从而导致因这个宏的错误使用而导致的编译错误没有被正确得提示。1.653例如和上面这段宏有关的编译错误,可能会提及1.653而不是。但是随着编译器的发展,一个健壮的编译器已经能发现并定位到#define导致的错误。1.653这段代码存在试图给宏赋值,因为是一个左值自然会出现编译错误。这段error的含义是:赋值操作的左侧需要一个lvalue。
2024-05-17 00:41:20 382
原创 C++如何实现不可被继承的类
因为在C++中,当创建派生类的对象时,会首先调用基类的构造函数,然后再调用派生类的构造函数。因此,构造一个派生类对象会调用两个构造函数:一个是基类的,一个是派生类的。那么基类的构造函数被私有化后,派生类将无法访问基类的构造函数,从而导致编译错误,也就意味着我们实现了一个不可被继承的类。但是这个设计方式限制了我们创建基类对象实例的途径,我们只能通过创建一个public静态成员的方式来创建类的实例。当然,我们也可以通过final关键字限制析构函数的覆盖,来间接限制继承,这里不做赘诉。
2024-05-15 23:36:31 357 1
原创 以对象管理资源:智能指针
我们利用对象生命周期结束自动析构这一点,将资源生命周期和对象生命周期进行绑定,从而确保资源正确释放。这类容器来取代动态分配的数组,而非使用智能指针来管理动态分配的数组。不允许复制,但是复制的需求确实存在,所以出现了引用计数智能指针。可以管理一个对象的资源,但是不允许对其进行复制。被销毁时(即计数降为0时),它才会释放所管理的资源。管理的对象,但不会增加其引用计数,当最后一个。等,并不会造成内存泄漏,因为对它们而言。是允许复制和赋值的,这类操作会使得。所指向的对象就会被销毁,即使。,就会出现内存泄漏的情况。
2024-05-14 21:59:53 1197 2
原创 C++中的extern关键字
关键字只是声明了一个已经存在的变量或者函数,而不会创建新的存储空间。实际的存储空间是在变量的定义处或者函数的定义处创建的。关键字用于声明一个变量或函数,这个变量或函数在其他文件中定义,这通常用于在多个源文件之间共享变量或函数。对于任何在其他源文件中定义非静态变量或非静态函数,只要使用。关键字对其进行声明,即可在当前源文件下进行使用。的变量,所以需要对两个源文件进行编译链接。修饰的变量和函数的。
2024-05-12 23:06:53 324 1
原创 在ubantu上下载安装Bazel
目录中,要全局使用Bazel命令需要将此目录添加到默认路径。下载Bazel二进制安装程序。命令可查看其他安装选项。
2024-05-09 00:11:38 464
原创 从源码理解Go语言切片扩容机制之容量大小
切片的扩容时,新分配的切片容量由定义在Go源码./src/runtime/slice.go文件中的nextslicecap函数的newcap计算策略和growslice函数中的内存对齐策略共同决定。
2024-05-05 19:58:57 267 2
原创 Go语言中的单元测试和基准测试
Go语言内建`testing`包,我们可以简单地通过`导入测试包`、`约定命名`和`ge test`快速完成单元测试和基准测试的编写和执行。
2024-05-02 11:11:46 825 2
原创 Go语言中的模块
在Go语言中,我们可以通过模块(module)来聚合多个包,将一些零散的功能合并为一个完整的模块。在模块中,我们可以指定运行这部分代码所需要的依赖,包括Go语言的版本和它依赖的其他模块的集合,这个指定的内容通常存储在模块的go.mod文件中。
2024-05-02 00:44:08 81 1
原创 Go语言中如何实现协程同步
如果只有一个工作协程,需要主协程等待工作协程完成任务,可以使用通道来实现同步。如果需要等待有多个协程,一般有两种方式:使用缓冲通道、1.使用缓冲通道阻塞等待所有协程的完成信息。
2024-04-29 22:11:04 645 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人