Go 限制函数参数 假设我们现在正在编写一个提供给外部使用的函数名 Fn 123func Fn(a int) { // do something} Fn 接受一个 int 型的值,要求 a 只能是 1, 3 ,5 其中的一个,该如何去限制呢。 最简单的方式就是增加一段判断,在不符合要求时返回错误,就像下面这样。 123456789func IPAddr(a int) error { 2023-11-30 #Go
TLA+,概念初识 假设我们正在为银行构建一项电汇服务。用户可以向其他用户进行转账。作为要求,我们不允许任何可能使用户账户透支或余额降至零以下的转账。在高层次上,代码可能如下所示: 1234def transfer(from, to, amount) if (from.balance >= amount) # guard from.balance -= amount; # withdraw to.ba 2023-11-29 #TLA+
解构类型参数 这篇文章是对 Go 官方博客 Deconstructing Type Parameters 的翻译. 所使用的 Go 版本为 1.21. Slice 包的函数签名slice.Clone 函数非常的简单,它复制了任何类型的 slice 123func Clone[S ~[]E, E any](s S) S { return append(s[:0:0], s...)} 上 2023-11-22 #Go
commands out of sync. Did you run multiple statements at once? Go 的 mysql 驱动库 github.com/go-sql-driver/mysql 在连接数据库时,有时会产生一个奇怪的错误 1"commands out of sync. Did you run multiple statements at once?" 这个错误的字面意思是同一时刻执行了多个 SQL 语句。咋看上会让人感到很迷惑,特别是这个错误有可能发生在数据建立 2023-11-16 #MySQL #Go
raft 日志复制 在上一篇的内容中,我们学习了 raft 的 Leader 选举。在这一篇中,我们将学习 raft 的日志复制。 在 raft 算法中,副本数据是以日志(Log)的形式存在的。在收到来自客户端的信息后,Leader 会复制日志到 Follower,并 Apply 到状态机。 日志是什么日志是由日志项组成的,每个日志项代表一条数据操作命令。 日志项的格式分为三个部分,分别是 Index: 日志项的索 2023-11-13 #raft
raft Leader 选举 raft 协议是当前分布式系统开发的首选共识算法。raft 协议是一个一切以领导者为主,实现一系列值的共识和节点日志的一致性。 raft 协议将共识问题拆分成三个子问题 Leader 选举,Leader 故障后集群能快速选出新 Leader; 日志复制, 集群只有 Leader 能写入日志, Leader 负责复制日志到 Follower 节点,并强制 Follower 节点与自己保持相同; 安 2023-11-08 #raft
声明式 API 声明式 API 是一种软件设计理念和做法,它要求用户描述他们想要达到的目标状态,由服务自身去令系统达到目标状态。 在声明式 API 中,用户不需要关心系统内部的实现细节,只需要描述他们想要的结果即可。这使得声明式 API 更加易于理解和使用,也更容易维护和扩展。 声明式 API 与命令式 API 的区别在于,命令式 API 要求用户描述一系列的动作,这些动作如果被正确的顺利执行,最终结果是系统达到 2023-11-07 #k8s
无法比较的Go结构体 比较运算符在 Go 中比较运算符用于比较两个操作数的大小,并产生一个布尔值。 123456== 等于!= 不等于< 小于<= 小于等于> 大于>= 大于等于 其中 == 和!= 操作符号用于两个 comparable 的类型, 而 <, <=, >, and >= 用于比较 ordered 的类型。类型的定 2023-10-30 #Go
goroutine-stop 在 Go 的开源项目中, 经常能够看到通过关闭一个 stopc 的通道来退出 goroutine 的写法, 如下面这个例子 1234567891011121314151617181920212223242526272829303132333435363738package mainimport ( "fmt" "time")func main() { 2023-10-19 #Go
build-xtrabackup-on-centos-aarch Percona xtrabackup arm 版编译xtrabackup 官方只提供了 x86 版本的安装包, 在 arm 环境上使用需要自己手动编译。这篇文档主要介绍在 CentOS arm 版上编译安装 xtrabackup。 X86 版本的安装方式可以参考这篇官方文档。 安装编译工具xtrabackup 编译需要使用 cmake3, 如果环境尚未安装 cmake3, 可以使用下面的命令来编 2023-08-01 #MySQL