Rust tips #41 ~ #60

Tip #41

类似于 Go 语言中的通道(Go 的 channel),Rust 中的 std::sync::mpsc 提供了一种线程间安全地读写数据的机制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let val = String::from("hi");
tx.send(val).unwrap();
});
let received = rx.recv().unwrap();
println!("Got: {}", received);
}

在这个例子中,我们创建了一个通道,然后在一个线程中发送了一个字符串。在主线程中,我们等待接收这个字符串并打印它。

阅读全文

Rust tips #21 ~ #40

Tip #21

在 Rust 中,我们经常使用 Clone()Copy()。这两者之间的区别是什么?

  • Copy:支持 Copy 的类型可以安全地通过字节复制的方式进行复制,可以类比 C 语言中的 memcpy 函数。

  • Clone:支持 Clone 的类型也可以被复制,但它通常需要执行一些逻辑操作来完成深拷贝。

阅读全文

如何将图片编码成base64?

图片的 base64 编码在多种上下文中都很有用。当需要通过旨在处理文本数据的媒体存储或传输图片时,它通常会被使用,比如嵌入到网页或者通过 API 上传图片。这篇文章将介绍如何使用 Go 标准库得到任何图片的 base64 编码的值。

阅读全文

Rust tips #1 ~ #20

Tip #001

Rust 不支持静态 vec(static vec),但是最接近的是静态数组。例如,如果你想存储三个字符串的数组,可以尝试这样: static STRINGS : [&str;3] = ["a", "b", "c"]

阅读全文

Redka - 父亲是Redis,母亲是SQLite

Redka旨在使用SQLite重新实现Redis的优秀部分,同时保持与Redis API的兼容性。

有意思的特性:

  • 数据不必完全装载在内存中。
  • 支持ACID事务。
  • 使用SQL视图以便于内省和报告。
  • 同时提供进程内(Go API)和独立(RESP)服务器。
  • 兼容Redis的命令和线路协议。

Redia 并不期望完全达到 Redis 那么高的性能,但是性能上也并不会落后很多。它的主要功能还是 SQL + Redis 的功能,集成了两种优秀产品 SQLite 和 Redis 的盛世美颜。

阅读全文

命令分发模式

命令分发模式 (command dispatcher pattern)不属于23种经典的设计模式。它是一种不太为人所知的设计模式,它主要用于构建可扩展、可插拔的系统架构,将请求与执行请求的操作对象解耦。它类似于命令模式(Command Pattern),但更加灵活和动态。

虽然Command Dispatch Pattern不属于那23种经典模式,但它确实是一种很有价值的模式,可以应用于需要在运行时动态添加、修改或删除操作的系统中,使系统更加灵活和可扩展。

这种模式通过允许方便的添加、替换或移除任何命令处理器, 非常的灵活,将命令调用和命令处理解耦。而且每个命令可以由单独的命令处理器处理,代码组织和维护也很方便。

实际上,对于 Gopher 来讲,必然已经接触到这个模式了,只不过少有人指出或者梳理这种模式,但是在标准库和一些知名的项目中,其实已经自然的应用了,而且看起来整个架构也非常的清爽。

阅读全文

使用Go语言实现 pping

大家好,我是鸟窝。

在前一篇“pping:被动式ping,计算网络时延”一篇中,我给大家介绍了 pping 这个工具的原理和使用方法。这篇文章中,我将使用 Go 语言实现 pping 工具。

阅读全文

让 Rob Pike 或者字节跳动的同学实现一个红黑树

红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构。它在1972年由鲁道夫·贝尔发明,被称为“对称二叉B树”,它现代的名字源于利奥尼达斯·J·吉巴斯和罗伯特·塞奇威克于1978年写的一篇论文。红黑树的结构复杂,以至于有些个别公司拿它当做面试题现场实现,但它的操作有着良好的最坏情况运行时间,并且在实践中高效:它可以在O(log^n)时间内完成查找、插入和删除。

阅读全文