Rust 中的 String 为什么不能通过下标去访问

在 Rust 中,String 类型是一个动态可变的 UTF-8 字符串,与传统的字符数组不同。UTF-8 字符串的特点是每个字符可能占用不同数量的字节,因此通过下标去访问字符串的字符并不是一个常量时间的操作,因为需要遍历字符串来找到相应的位置。 Rust 中的 String 类型实际上是一个包装了 Vec<u8>(字……

阅读全文

Rust Benchmark初探

在Rust中,您可以使用标准库中的 test 模块来编写和运行基准测试。基准测试是用于测量代码性能的测试类型,通常用于比较不同实现的性能差异。在Rust中使用基准测试的一般步骤: 添加依赖: 确保您的项目的 Cargo.toml 文件中包含 test 和 bencher 依赖。在 [dev-dependencies] 部分添加如下行: $ cargo add bencher@0.1.6 --dev 查看Cargo.toml [dev-dependencies] bencher = "0.1.6" 创……

阅读全文

二维码登录实现方案

扫描二维码登录是一种常见的用户认证方式,通常用于移动应用或Web应用。下面是一个简单的实现方案,涵盖了基本的步骤: 生成二维码: 服务器端生成一个包含登录信息的二维码,并将其返回给客户端。 展示二维码: 客户端展示生成的二维码供用户扫描。这可以通过在移动应用或网页上显示二维码图片实现。 扫……

阅读全文

为什么布尔占用一个字节(byte),而不是一位(bit)

在很多编程语言中,布尔类型通常被设计为占用最小的存储空间,因为它只有两个可能的值:true(真)和 false(假)。一个字节(8位)是一个常见的存储单位,因此布尔类型通常被分配一个字节的空间。 占用一个字节的好处包括: 对齐: 许多计算机体系结构和内存管理系统更喜欢以字节对齐的方式来处……

阅读全文

中国为什么只占一个时区

中国整个国家采用一个统一的时区,即中国标准时间(CST),这是为了保持国家的统一和协调。历史上,中国曾经采用过多个时区,但在1949年中华人民共和国成立后,为了国家的一体化和管理的方便,政府决定采用单一的时区制度。 中国横跨辽阔的地理区域,包括东部的大城市如北京和上海,以及西部的新……

阅读全文

π的由来

圆周率(π)是一个数学常数,代表了圆的周长与其直径的比值。它是一个无理数,即它的小数部分无限不循环且无法被表示为两个整数的比例。圆周率的值大约是3.14159265359…,它的小数部分永远不会终止或重复。 圆周率的起源可以追溯到古代的各个文明。以下是一些与圆周率相关……

阅读全文

设计模式与算法的区别

设计模式(Design Patterns)和算法(Algorithms)是软件开发领域中两个不同的概念,它们有着不同的作用和应用。 设计模式: 设计模式是在软件设计过程中针对常见问题的解决方案的一种抽象描述。它们并不是具体的实现代码,而是关于如何组织和设计代码以解决特定类型问题的指导原……

阅读全文

谈谈数据库分解决提交

数据库中的分阶段提交(Two-Phase Commit,2PC)是一种协议,用于确保在分布式事务中所有参与者(数据库实例)要么都提交事务,要么都回滚事务。分阶段提交协议的主要目标是 保证事务的一致性和原子性。 以下是分阶段提交协议的基本工作流程: 准备阶段(Prepare Phase): 事……

阅读全文

Go如何控制并发请求数

仅仅限制并发数 var limit = make(chan int, 300) func main() { // ………… for _, w := range work { go func() { limit <- 1 w() <-limit }() } // ………… } 控制单位时间内并发数 可以通过使用 time.Tick 和 sync.WaitGroup 来控制每秒请求并发数。 具体实现方法如下: const maxQPS = 100 // 每秒最大请求数 func main() { qpsInterval := time.Second / time.Duration(maxQPS) // 每个请求的时间间隔 var wg sync.WaitGroup ticker := time.Tick(qpsInterval) for i := 0; i < 1000; i++ { wg.Add(1) <-ticker // 等待下一个请求时间……

阅读全文

Golang 为什么nil != nil

摘自go官网 Frequently Asked Questions Why is my nil error value not equal to nil? Under the covers, interfaces are implemented as two elements, a type T and a value V. V is a concrete value such as an int, struct or pointer, never an interface itself, and has type T. For instance, if we store the int value 3 in an interface, the resulting interface value has, schematically, (T=int, V=3). The value V is also known as the interface’s dynamic value, since a given interface variable might hold different values V (and corresponding types T) during the execution of the program. An interface value is nil only if the V and T are both unset, (T=nil, V is not set), In particular, a nil interface will always hold a nil type. If we store a……

阅读全文