自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 资源 (2)
  • 收藏
  • 关注

原创 基于 net/http 抽象出 go 服务优雅停止的一般思路

什么是优雅停止?在谈优雅停止前,我们可以说说什么是优雅重启,或者说热重启。简言之,优雅重启就是在服务升级、配置更新时,要重新启动服务,优雅重启就是在服务不中断或连接不丢失的情况下,重启服务。优雅重启的整个流程中,新的进程将在旧的进程停止前启动,旧进程会完成活动中的请求后优雅地关闭进程。优雅重启是服务开发中一个非常重要的概念,它让我们在不中断服务的情况下,更新代码和修复问题。它在维持高可用性的生产环境中尤其关键。从上面的这段可知,优雅重启是由两个部分组成,分别是优雅停止和启动。

2024-04-14 18:58:31 561 1

原创 一个基于差异同步数据库结构的工具 - Skeema

Skeema 是基于差异同步数据库 schema,这让我们只要表结构的终态就行。还有,skeema 支持在不同环境间同步数据库 schema。Skeema 支持 linter 识别 SQL 语句,方便我们将其集成到 CICD 中提升 Schema 质量。还有,它默认是禁用了一些不安全的数据库操作,如删表删字段等操作。如果要说缺点,它现在只支持 MySQL 和 MariaDB。Skeema 作为一个基于差异同步数据库 schema 的工具,简单强大。它简化了数据库 schema 的管理。

2024-03-06 20:45:09 938

原创 一个基于增量同步数据库结构的工具 - Goose

本文介绍了一个 GO 开发的基于增量实现数据结构迁移的工具 goose,还基于 shell 让它能进行多环境管理,有趣的,哈哈。本文主要是通过 SQL 脚本演示,Goose 本身也是支持 Go 脚本管理 Schema 的,灵活度更高。下篇文章,我将介绍另一个基于差异管理数据库 schema 的工具,依然是用 Go 实现的。

2024-02-29 14:35:20 433

原创 我用 Go 开发了一个简易版 shell

通过开发这个简单的 shell,了解 Go 如何读取如用户输入,解析与执行用户命令。对 shell 的流程也有了一个大概了解。未来,如果有想法,或许会继续扩展这个 shell,添加更多内建命令,可以将不同部分模块化,如 Prompt, Reader, Parser 和 Command 都是可以继续抽象以支持更多能力。如果继续它的开发,期待学习到更多关于系统编程和 Go 语言的高级特性。

2024-02-29 14:34:35 832

原创 如何正确处理 Go 项目中关于文件路径的问题

常见的是用绝对路径规则指定配置和资源文件路径,如 Linux 或其他类 Unix 系统有一套 XDG 基准规则(XDG Base Directory Specification),有兴趣可了解下。或者是另一套更常见日常项目中的方案,通过环境变量或其他方式设置固定的项目根目录或工作目录,而其他文件路径皆相对于这个固定不变目录的位置。实际上,这种方式更常见于平时的项目中。无论可执行文件被放在什么路径下,都不会对其他文件的路径位置产生影响。

2024-02-26 15:41:07 1171

原创 数据库结构变更同步:增量 VS 差异

管理数据库结构的变更是挺需要技巧的一件事。了解增量同步和差异同步的各自优劣,能让我们根据实际情况,选择更合适的方法。对于我个人来说,增量同步的使用经历的确是不好受。一般情况下,我会优选差异同步。

2024-02-26 15:37:59 892

原创 Go 中如何高效遍历目录?探索几种方法

在本文中,我们系统介绍了 Go中多种遍历目录文件的方法。从传统的,到 Go 1.16 引入的os.ReadDiros.File的ReadDir方法。每种方法适用于不同的场景,如何选择要取决于你的需求、Go 版本、性能。如果你需要递归遍历,也可以使用基于DirEntry的实现,提高遍历的性能。Go 中如何遍历目录?探索几种方法。

2024-02-23 22:35:22 1366

原创 Go 如何按行读取(大)文件?尝试 bufio 包提供的几种方式

在正式介绍切割规则前,先说明下什么是完整 token。前面一直在说 token,如定义的就是 token 最大 size。token 定义其实就是对一次读取内容的定义,如一行文本,一个单词,或者一个固定大小的块。相对于特定分隔符,分割规则更加灵活,可以定义任意的分割方式。而是一个非常灵活的工具,它提供了自定义切割文本规则的函数 -。// 参数// data []byte: 未处理数据的初始子串,当前需要处理的输入数据。

2024-02-23 18:50:03 1241 2

原创 推荐一个可用于快速创建 TUI 应用的框架 - Bubble Tea

什么是 TUI?为了防止可能有人不知道,简单解释一下。TUI,全称为文本用户界面(Text-based User Interface),是一种用户界面类型。对之对比的就是 GUI(Graphical User Interface)。我开始还以为 TUI 中的 T 的全称是 terminal。TUI 是通过纯文本和基本字符在终端或控制台窗口中展示信息和交互选项。与 GUI 不同,TUI 不依赖图形元素如窗口、图标或鼠标指针,而是使用文本字符来构建用户界面的布局和元素。

2024-02-22 14:17:57 985

原创 Go 中的 init 如何用?它的常见应用场景有哪些呢?

本文介绍了到init()函数在 Go 中的特殊之处和使用方式。它提供了一种不同于其他语言的机制来初始化包,但也需谨慎使用以避免不必要的复杂性。最后,希望这篇文章能帮助你更好地理解和使用 Go 的init()函数。Go 中的 init 如何用?它的常见应用场景有哪些呢?

2024-02-21 14:34:57 1039

原创 Go 是否有三元运算符?Rust 和 Python 是怎么做的?

本文主要就 Go 中三元运算符展开讨论,从简单if-else语句、到基于匿名函数的单行表达式、及泛型抽象 If 函数等方式来实现类似的功能。当然,我没有建议使用这些方式,在没有内置支持的情况下,if-else的写法就挺好的。Go 中如何实现三元运算符?Rust 和 Python 是怎么做的?

2024-02-19 14:47:56 1386

原创 Go 语言中如何大小端字节序?int 转 byte 是如何进行的?

嗨,大家好!我是波罗学。。我们先看这样一个问题:“Go 语言中,将 byte 转换为 int 时是否涉及字节序(endianness)?我可以直接使用进行转换吗?这个问题非常简单,直接回答不涉及字节序,可以直接转换。但为什么呢?如果要彻底搞明白这个问题,还是要了解下字节序这个概念。接下来,让我带你深入地了解这个问题,以及如何在 Go 中如何处理字节序。

2024-02-07 23:18:11 1546

原创 Go语言中 enum 实现方式有哪些?一定要绝对类型安全吗?

Go 语言中,枚举的表达方式多种多样。从简单的iota到复杂的结构体方式,每种方法都有其适用场景。作为开发者,最好是根据自己的具体需求,选择合适的实现方式。最后,希望这篇文章能帮助你在使用 Go 语言时,更加灵活且游刃有余地使用枚举 enum。Go语言中 enum 实现方式有哪些?一定要类型安全吗?stringer。

2024-02-06 23:24:10 897

原创 Go 中如何检查文件是否存在?可能产生竞态条件?

嗨,大家好!。Go 中如何检查文件是否存在呢?如果你用的是 Python,可通过标准库中函数实现。遗憾的是,Go 标准库没有提供这样直接的函数,好在,没有直接的,却有不那么直接的。本文将基于这个话题展开,介绍 Go 中如何检查文件是否存在。另外,本文最后还会介绍一个小注意点,即在判断文件是否存在时,如何避免中潜在的竞态条件。os.Stat。

2024-02-05 21:40:17 1348

原创 Go 中如何解析 json 内部结构不确定的情况

本文由一个问题引出主题,如何处理不确定结构的 json 数据,开头提出了三种可行的解决方案,三种方案是逐层递进的。最终的方式需要依赖反射实现,当然同样的问题别人早就想到了,并开发了一个第三方包,mapstructure。最后,本文通过一个实际的案例演示了 mapstructure 的使用。Go 中如何解析 json 内部结构不确定的情况。

2024-02-05 20:52:32 1326

原创 终端环境:zsh 和 oh-my-zsh

本文想要介绍的内容已完成。我们从 zsh 与 bash 对比,了解到 zsh 的强大。接着开始实操,从安装 zsh,oh-my-zsh、主题配置,到介绍 5 个内置插件,2 个三方插件。最后,希望本文能对你的终端操作效率提到一点点帮助,我就心满意足了。我的终端环境:zsh、oh-my-zsh,提示主题和 7 个效率插件。

2024-02-04 14:26:33 1013

原创 Go 中如何打印结构体?代码调试效率提升

首先,我们来定义一个结构体,它会被接下来所有的方法用到。Age int8Sex stringID int64我们定义了一个Article结构体用于表示一篇文章,内部包含内部实现了IDTitle和Content基础属性,还有一个字段是Author结构体指针,用于保存作者信息。我将先介绍四种基本的方式。本文主要介绍了 Go 语言中打印结构体的不同方法。我们从简单的fmt.Printf到使用反射,甚至是第三方库,我们是有很多选择。简单主题深入起来,扩展内容也可很丰富。

2024-02-04 14:16:39 770

原创 Go 中 struct tag 如何用?基于它实现字段级别的访问控制

前面展示的都是利用标准库或三方库提供的能力,如果想自定义 tag 该如何实现?毕竟有些情况下,如果默认提供的 tag 提供的能力不满足需求,我们还是希望可以自定义 tag 的行为。这需要了解与理解 Go 的反射机制,它为数据处理和元信息管理提供了强大的灵活性。fmt.Println(field.Tag.Get("mytag")) // 输出: MyName在这个例子中,我们的Person的字段Name有一个自定义的 tag -mytag,我们直接通过反射就可以访问它。

2024-02-01 22:00:23 1092

原创 如何有效获取 Go 变量类型?探索多种方法

在 Go 语言中,理解和操作类型是编写有效代码的关键。本文介绍了几种检索变量类型的方法,包括字符串格式化、reflect包的使用,以及类型断言和类型选择。通过这些工具,你可以更好地理解和使用 Go 语言的类型系统,编写出更清晰、更有效的代码。如何有效获取 Go 变量类型?探索多种方法。

2024-01-29 15:58:10 1443

原创 终端环境:iTerm2

我将主要介绍如何安装与配置 iTerm2,安装成功后,会带着一起体验的一些能力。首先,iTerm2 是一款终端软件,它是 macOS 下默认终端 Terminal 的替代品。每次拿到新电脑,或者因某种原因重装系统,我首先要做的就是下载 iTerm2 来替换默认的终端 terminal。本文重点介绍了 iTerm2 的安装、颜色面板的配置,还有体验其核心的能力,最有趣的部分是通过 iTerm2 的 Python API 能力,实现了一些自动化任务(自动更换背景和布局管理),提高趣味性和效率。

2024-01-29 15:49:56 990

原创 快速了解 Kafka 基础架构

今天来聊下大数据场景下比较流行的消息队列组件 kafka。本篇文章将主要从理论角度来介绍。kafka 是一款开源、追求高吞吐、实时性,可持久化的流式消息队列,可同时处理在线(消息)与离线应用(业务数据和日志)。在如今火热的大数据时代,得到了广泛的应用。

2024-01-28 15:42:58 1213

原创 Go 语言实现可选参数:重载?变长参数?

这篇博文介绍了在Go语言中实现可选参数的几种方法:可变长参数、使用Map、结构体和函数选项模式。每种方法都有其适用场景和优缺点,你可以根据自己的需要选择合适的方法。Go 语言实现可选参数:重载?变长参数?

2024-01-28 14:48:13 1234

原创 powermock: 一个支持 gRPC 的 Mock Server

编译生成文件包括 greeter/apis/greeter.pb.go 和 greeter/apis/greeter_grpc.pb.go。整体而言, powermock 易于使用,但刚刚开源,还有些待完善的地方。但鉴于代码易读,容易扩展,与我们而言,当前的确是一个不错的选择。

2024-01-27 16:52:20 923

原创 Go 命令行解析 flag 包之通过子命令实现看 go 命令源码

本文介绍了 Go 中如何通过 flag 实现子命令,从FlagSet这个结构体讲起,通过 flag 包中默认提供的梳理了FlagSet的处理逻辑。在基础上,实现了子命令的相关功能。本文最后,分析了 Go 源码中go如何使用 flag 实现。因为是纯粹使用 flag 包裸写,读起来稍微有点难度。本文只算是一个引子,至少帮助大家在大的方向不至于迷路,里面更多的细节还需要自己挖掘。Go 命令行解析 flag 包之通过子命令实现看 go 命令源码。

2024-01-27 16:44:44 1183 3

原创 Go 的命令行解析 flag 包如何扩展新类型呢?

本文介绍了如何为 flag 扩展一个类型支持,通过分析源码理清实现思路。最后创建了一个只接收指定范围值的 Value。Go 命令行解析 flag 包之扩展新类型。

2024-01-26 15:02:04 1290

原创 Go 命令行解析 flag 包之快速上手

开发一个命令行工具,视复杂程度,一般要选择一个合适的命令行解析库,简单的需求用 Go 标准库 flag 就够了,flag 的使用非常简单。当然,除了标准库 flag 外,也有不少的第三方库。比如,为了替代 flag 而生的pflag,它支持 POSIX 风格的命令行解析。关于 POSIX 风格,本文末尾有个简单的介绍。更多与命令行处理相关的库,可以打开命令行一节查看,star 最多的是和urfave/cli,与 flag / pflag 相比,它们更加复杂,是一个完全的全功能的框架。

2024-01-26 14:33:37 1115

原创 详细介绍 Go 中如何实现 bitset

继续介绍集合的几个方法,它们的定义类似,都是一个BitSet与另一个BitSet// 交集// ...// 并集// ...// 差集// ...本篇文章主要是参考了几个开源包的基础上,介绍了 bitset 的实现,比如bit和bitset等。总的来说,位运算就是没有那么直观,感觉脑子不够用了。详细介绍 Go 中如何实现 bitset。

2024-01-25 14:29:16 1373

原创 Go Module 依赖关系的可视化 - 基于 GO 开发的一个小工具

接下来,开发这个小程序吧,我将这个小程序命名为modv,即 module visible 的意思。项目源码位于。

2024-01-25 14:09:05 1011

原创 深入 Go 如何实现 HTTP 文件上传

早前写过一篇文章,Go HTTP 请求 QuickStart。当时,主要参考 Python 的 requests 大纲介绍 Go 的 net/http 如何发起 HTTP 请求。最近,尝试录成它的视频,访问地址。发现当时写得挺详细的,发现当时虽然写得比较详细,但也只是介绍用法,可能不知其所以然。比如文件上传那部分,如果不了解 http 文件上传协议 RFC 1867,就很难搞懂为什么代码这么写。今天,就以这个话题为基础,介绍下 Go 如何实现文件上传。相关代码请访问 httpdemo/post。本文

2024-01-24 15:59:27 1507

原创 Go 定时器:如何避免潜在的内存泄漏陷阱

这篇文章将探讨的是 Go 中如何高效使用 timer,特别是与select 一起使用时,如何防止潜在的内存泄漏问题。

2024-01-24 14:31:51 593

原创 Go 中如何解析 json 内部结构不确定的情况

本文由一个问题引出主题,如何处理不确定结构的 json 数据,开头提出了三种可行的解决方案,三种方案是逐层递进的。最终的方式需要依赖反射实现,当然同样的问题别人早就想到了,并开发了一个第三方包,mapstructure。最后,本文通过一个实际的案例演示了 mapstructure 的使用。Go 中如何解析 json 内部结构不确定的情况。

2024-01-23 19:44:18 1168

原创 如何测试你的 Golang 代码

我们选择开源项目,通常会比较关注这个项目的测试用例编写的是否完善,一个优秀项目的测试一般写的不会差。为了日后自己能写出一个好的项目,测试这块还是要好好学习下。常接触的测试主要是单元测试和性能测试。毫无意外,go 的 testing 也支持这两种测试。单元测试用于模块测试,而性能则是由基准测试完成,即 benchmark。Go 测试模块除了上面提到的功能,还有一项能力,支持编写案例,通过与 godoc 的结合,可以非常快捷地生成库文档。本文主要介绍了 Go 中测试模块使用的一些基础方法。

2024-01-23 14:02:56 842

原创 Go 虚拟环境管理工具 gvm 原理介绍与使用指南

Go 的版本管理,并非包的依赖管理,而且关于如何在不同的 Go 版本之间切换。平时的工作中,正常情况,我们不会遇到这样的需求,所以可能并不明白它的价值。简单说下我写这篇文章的背景吧。最近几周,Go 最重要的一则消息应该莫过 9月份 Go 1.13 的正式发布。它的相关升级可查看Go 1.13 正式发布,看看都有哪些值得关注的特性或官方。对于一名 gopher 而言,可能早已按捺不住自己那颗躁动的心,想尽快体验下新版的升级项。

2024-01-23 13:54:26 1656

原创 Go 的 Http 请求系统指南

本文以 Python 的 requests 文档为指导方向,整理了 requests 快速入门文档中的案例在 GO 的是如何实现的。要说明的是, GO 其实也提供了对应于 requests 的克隆版本,github地址。暂时我也还没有看,有兴趣的朋友可以去研究一下。

2024-01-22 19:10:47 1294

原创 GO 的那些 IDE

本篇文章从为什么要使用IDE谈起,介绍了IDE的一些发展史。同时,总结了一款基本的IDE通常都会提供哪些功能。只要了解了这些,可以帮助我们以后更好地使用它们。最后,介绍了现在市面上流行的几款IDE,并在我力所能及的范围内分析了它们各自的优劣。Go 的那些 IDE。

2024-01-22 13:00:11 1518

原创 从 fatal 错误到 sync.Map:Go中 Map 的并发策略

为什么 Go 语言在多个 goroutine 同时访问和修改同一个 map 时,会报出 fatal 错误而不是 panic?我们该如何应对 map 的数据竞争问题呢?这篇文章将带你一步步了解背后的原理,并引出解决 map 并发问题的方案。

2024-01-21 22:53:33 1094

原创 如何理解 GO 语言的接口 - 鸭子模型

Go 接口是一组方法的集合,可以理解为抽象的类型。它提供了一种非侵入式的接口。任何类型,只要实现了该接口中方法集,那么就属于这个类型。举个例子,假设定义一个鸭子的接口。Quack() // 鸭子叫DuckGo() // 鸭子走fmt.Println("我是小鸡")这只鸡和一般的小鸡不一样,它比较聪明,也可以做鸭子能做的事情。fmt.Println("嘎嘎")fmt.Println("大摇大摆的走")注意,这里只是实现了 Duck 接口方法,并没有将鸡类型和鸭子接口显式绑定。

2024-01-21 13:12:34 706

原创 Golang 中如何实现 Set

在Go编程中,数据结构的选择对解决问题至关重要。本文将探讨如何在 GO 中实现 set 和 bitset 两种数据结构,以及它们在Go中的应用场景。

2024-01-21 02:05:27 1148

原创 GO 中高效 int 转换 string 的方法与高性能源码剖析

通过快速处理小整数、优化的10进制转换算法、以及对2的幂基数的特别处理,这些函数能够提供高效且稳定的性能。是 “Integer to ASCII” 的简写,它提供了一种快速且简洁的方式实现整数到字符串之间的转换。简单而言,即对于小于 100 的十进制整数,采用这个快速实现方案,这或许也是整数转字符串的常见使用场景把。提供了对整数转换过程的更细粒度控制,包括 base 的选择(例如,十进制、十六进制等)。以下是对其核心部分的详细解读,突出了其性能优化的关键方面,并结合了具体的源码实现。

2024-01-20 17:16:57 1594

原创 如何防止你的 Goroutine 泄露 Part2

本系列文章分别从代码实现和监控检测两个角度介绍了如何避免 goroutine 的泄露。Go 的并发降低了并发程序的开发难度,但并发一直都是个比较复杂的话题,为了用好它,必要学习还是不可缺少的。如何防止你的 Goroutine 泄露。

2024-01-20 01:11:11 806

unix网络编程源代码

UNIX网络编程卷一的代码 也是从网上找的。准备写博客学一下这些源码

2014-04-12

数据结构与算法

关于c/c++的STL模版库的使用,和排序,查找删除等一些列算法的解释

2013-03-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除