跳转至

博客

Go 语言中字符串与 rune 的迭代与非 UTF-8 字符的处理

在 Go 语言中,字符串是由 UTF-8 编码的字符序列构成的,而字符串中的每个字符实际上是由一个或多个 rune(即 Unicode 代码点)组成的。Go 的 for range 循环提供了便捷的方式来遍历字符串中的字符,它会将每个字符解析为 rune 类型。然而,在某些情况下,特别是处理包含非 UTF-8 编码字节的字符串时,直接使用 for range 可能会导致一些问题。

Golang 中的意外变量幽灵(Accidental Variable Shadowing)

在 Go 语言中,短变量声明(:=)是一种非常便捷的语法,它可以让我们在声明变量时简洁地赋值。然而,使用短变量声明时,如果局部作用域中和外部作用域的变量同名,可能会发生 意外的变量幽灵(Accidental Variable Shadowing) 问题,导致局部变量的修改并不会影响到外部变量的值。

回文十进制数

Tip

如果把某个数的各个数字按相反的顺序排列,得到的数和原来的数相同,则这个数就是“回文数”。譬如 123454321 就是一个回文数。

问题: 求用十进制、二进制、八进制表示都是回文数的所有数字中,大于十进制数 10 的最小值。

Go 切片中删除元素的两种方法对比

在 Go 语言中,切片是一个非常常用的数据结构。当我们需要从切片中删除某个元素时,通常有两种实现方法:

  1. 使用 append 方法删除元素。
  2. 使用替换删除法。

本文将对这两种方法进行对比,分析各自的优缺点,并帮助你根据具体需求选择合适的实现方式。

使用 Shell 脚本管理 OpenVPN 守护进程

这篇技术博客涵盖了使用 Shell 脚本管理 OpenVPN 守护进程的完整过程,解释了每个关键步骤,并提供了代码示例。如果你有任何问题或想要进一步探讨,欢迎留言讨论!

版本管理:追溯数据的生长链

版本管理这个词,听起来是不是就很酷?想到版本管理,大家第一反应肯定是 Git!毕竟,它是专业的版本管理工具,功能强大得能把一堆数据的变动历史精确到秒。但别着急,我们的需求可不需要这么复杂的操作。经过简单分析,我发现,版本管理的核心其实就是 条件和状态,就像一个老派的分支决策题:你选择左边还是右边?

而且说到版本管理,我脑袋里立马浮现的图景是:一棵小树苗,每次更新就长高一点点,最终茁壮成参天大树,穿越时间的洪流,经历岁月的洗礼... 就是这个感觉!🌱

版本规则:看我怎么将小树苗养成大树

我们要给每条数据生成一个版本号,每次编辑后还能选择是否更新,从而追溯数据的“成长过程”。就像一棵小树苗的成长路线图。

版本号规则

  1. 版本号有两个部分:主版本(major)次版本(minor)
  2. 主版本从 A 开始,每次更新递增,比如:A → B → C → ...,主版本部分升得飞快!
  3. 当主版本到达 Z 时,我们不怕,因为...主版本会变成 A0,然后继续递增!这就是成长的奇迹!
  4. 次版本从 0 开始,每次递增 1,简简单单,循序渐进。
  5. 版本初始化为 A.0,并有两种更新方式:普通更新和归档更新。
  6. 普通更新:就像一个持续进化的过程,A.0 → A.1 → A.2...,每天进步一点点。
  7. 归档更新:让版本变得更加历史悠久,A.n → A(A.n) → B.0 → Z.n → Z(Z.n) → Z1.0 → ...,每一个版本都像是“宝贵的历史文物”!

这个版本更新规则,就像是给数据安排了人生路线图,每个版本都是它成长的一个节点。

版本更新映射关系:就像数据的身世档案

通过以下表格,我们可以看到不同版本更新方式的生动映射:

更新方式 当前版本 主版本 次版本 更新后版本
普通更新_0 A.0 A → A 0 → 0 + 1 A.1
归档更新(送审) A.1 A 1 A(A.1)
普通更新_1 A(A.1) A → B 1 → 0 B.0

看嘛!每个版本就像一个人类的成长记录,普通更新就像升级打怪,归档更新则像是“送审”的过程——你升级后得去展示自己,给大家看看你多厉害!

B-Tree 与崩溃恢复

B-Tree 是一种非常优秀的数据结构,适用于数据库和文件系统等场景。本文将从以下几个角度解析 B-Tree 的特点与实现。

B-Tree 作为平衡的 n 叉树

高度平衡的树

许多实用的二叉树(如 AVL 树或红黑树)被称为**高度平衡树**,即树的高度(从根到叶的深度)被限制为 \(O(\log(N))\),因此查找操作的复杂度为 \(O(\log(N))\)

B-Tree 同样是一种高度平衡的树,其所有叶节点的高度相同,这确保了其良好的查找性能。

B-Tree Data Structure

可能是以前没有接触过类似的数据结构设计,反复阅读了几遍依然有些不太理解。今天,我决定从读者的角度一步一步介绍我对这个数据结构的理解。

一个节点应该包含以下几个部分:

| type | nkeys |  pointers  |   offsets  | key-values | unused |
|  2B  |   2B  | nkeys * 8B | nkeys * 2B |     ...    |        |

每个 key-value 对的格式如下:

| klen | vlen | key | val |
|  2B  |  2B  | ... | ... |

用不到 100 行 Go 语言构建自己的容器

原文地址:https://www.infoq.com/articles/build-a-container-golang/

2013 年 3 月 Docker 的开源发布引发了软件开发行业打包和部署现代应用程序方式的重大转变。在 Docker 发布之后,许多相互竞争、相互补充和相互支持的容器技术也随之诞生,这导致了围绕这一领域的许多炒作和一些幻灭。本系列文章旨在揭示其中的一些困惑,并解释容器在企业中的实际使用情况。

本系列文章首先介绍了容器背后的核心技术以及开发人员目前的使用情况,然后探讨了在企业中部署容器所面临的核心挑战,例如将容器化集成到持续集成和持续交付管道中,以及加强监控以支持不断变化的工作负载和潜在的瞬时性。本系列最后展望了容器化的未来,并讨论了 unikernels 目前在前沿组织中发挥的作用。