Wang Rui

「每个不曾起舞的日子,都是对生命的辜负」

Go 错误处理

错误处理

前言 ​ go error 的显示处理事被吐槽的比较多的一个设计,主要是需要不断往上抛 error,会写一堆重复的代码,相比 try … catch 用起来可能没那么爽,以下是一个典型案例。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 type Person { age *Age sex *Sex } func (p ...

Go fasthttp 设计与实现

网络

Fasthttp 是什么? 官方介绍:fasthttp是为一些高性能边缘情况而设计的。除非您的服务器/客户端需要处理数千个每秒的小到中等请求并需要一致的低毫秒响应时间,否则fasthttp可能不适合您。对于大多数情况,net/http更好,因为它更易于使用并且可以处理更多情况。对于大多数情况,您甚至不会注意到性能差异。 目前,VertaMedia 在生产环境中成功地使用fasthttp,...

Go net/http 分析

网络

简介 ​ Net/http 是 Go 官方提供的网络库,本文主要介绍 net 包的简单使用及源码分析。 基本使用示例 Client 端 GET 请求示例 1 2 3 4 5 6 7 8 9 10 11 12 13 resp, err := http.Get("http://localhost:8000") if err != nil { fmt.Printf("get fai...

Mysql 协议抓包

网络

背景 有时候在本地调试mysql的时候需要抓取mysql协议包,我们可以使用 tcpdump、wireshark 等工具。由于wireshark属于界面友好型,所以通常使用wireshark进行抓包。 流程 在本地部署的mysql,客户端和服务端都位于同一台机器,所以需要抓取本地回环网络接口,如下图所示: 然后使用命令过滤mysql数据包:tcp.dstport == 3306 ...

BoltDB 数据结构

BoltDB

Page ​ 使用 BoltDB 的时候我们会初始化一个 DB 对象,一个 DB 对应的就是一个磁盘文件。而对应的磁盘文件,BoltDB 是以 Page 为单位进行数据读写的,换句话说数据在磁盘上是以 Page 为单位存储的。这里的 Page 和操作系统的 Page cache 大小一致,即 4K。 Page 结构 1 2 3 4 5 6 7 8 9 10 11 12 type pag...

BoltDB 基础概念

BoltDB 基础

BoltDB 是什么? ​ BoltDB 是一个纯粹的 k/v 存储数据库,本质上是一个本地的单机数据库系统。这个项目的目的是为了提供一个简单、快速、可信赖的数据库系统,在完全不需要诸如:mysql,postgres 数据库服务的情况下。 基本概念 创建数据库 ​ DB 是最顶层的对象,它是你磁盘上面的一个文件,也是你数据的一致性快照。 ​ 可以使用一下代码创建你的数据库: ...

Go 导包 etcd 与 grpc 版本兼容问题

包管理

背景 ​ 在一次代码开发过程中当我执行 go mod tidy 时,突然报了以下错误 1 google.golang.org/grpc/naming: module google.golang.org/grpc@latest found (v1.48.0), but does not contain package google.golang.org/grpc/naming 原因 ...

Go 包伪版本

伪版本管理

什么是 go.mod 伪版本标签? ​ 当我们使用 go module 进行包管理的时候,往往需要生成一个 go mod 文件,当我们引入三方包的时候,会在 go mod 文件中 require 对应的包,对应语法如下: 1 2 3 4 5 module rain go 1.18 require github.com/gin-gonic/gin v1.8.0 require vimag...

Sync Map 源码解析

Sync map

基础概念 ​ 众所周知,Go 语言的 Map 是非并发安全的,因此 Go 官方提供了一个并发安全的 Map 实现 Sync.map 并发安全的 Map 有哪些实现方式 ? 一个大的 Map 划分成多个分片,每个分片持有一把锁 读写分离,读和写分别是一个 Map ​ 第一中方式,orcaman 提供了这个思路的一个实现: concurrent-map,而 sync.map ...

Sync Atomic Value 简析

Sync Atomic Value

在 Go 语言标准库中,sync/atomic包将底层硬件提供的原子操作封装成了 Go 的函数。但这些操作只支持几种基本数据类型,因此为了扩大原子操作的适用范围,Go 语言在 1.4 版本的时候向sync/atomic包中添加了一个新的类型Value。此类型的值相当于一个容器,可以被用来“原子地”存储(Store)和加载(Load)任意类型的值。 历史起源 我在golang-dev邮件列...