所有文章列表

表格符号

Go 测试的地道写法:Table Driven Test

最近在写 Go 测试时发现官方与社群中有一种大力推崇的惯例:TableDrivenTest,我一直以为测试应该要保持简单愚蠢,但这种做法让我想到程式人的三大美德之一:「懒惰」。可能是因为这种模式通常只是测试框架包装下的方便手段,而 Go 社群文化下人人对于追求简单程式有一种莫名的执着。

扳手图示

Go Set 数据结构的地道写法

纪录近期从 JavaScript 迁移到 Go 的过程中实践 Set 资料结构的方式。先前代码使用 JavaScript Set 来实现不重复资料定义,但在 Go 语言当中并没有实践 Set 资料结构,但我们可以透过改造 map 来实践。

人与各种形状图示

通过 go:embed 在编译时将文件嵌入

纪录使用到其中一项 Go 1.16 的 embed 功能,可以把任何档案在编译时就包进去,进而不用烦恼路径与环境问题。如果资料需要在 runtime 被修改,那就不适合使用 embed,但如果它是「版本的一部分」,那 embed 是更安全的选择。

旗帜图标

4 种 Feature Flag 与使用时机

先前探讨到:什么是 Feature Flag 以及它解决什么问题?了解 Feature Flag 存在的价值后,今天了解更多关于 4 种类型的 Feature Flag 以及实战上的用途。不同目的的 Flag,在设计方式、生命周期、动态程度与管理策略上都有明显差异。

旗子符号

通过 OpenFeature 实践稳定产品功能发布

我一直觉得事情可以保持简单就好,有问题改程式码或环境变数切换就好,何必导入更复杂的套件管理与第三方服务呢?但真实情境当问题发生时不会有空闲慢慢部署与除错,就有必要透过更完善的 Feature Flag 规划来降低推送功能的风险,也能减少心脏病发作的机率。

盒子图示

熟悉使用 Go Module 与 Package

从 JavaScript 转写 Go 我其实还是不太熟悉 Go 如何模组化处理代码,虽然它们有大致相似的地方,但使用体验感觉非常简单甚至到简陋的程度,当然简单并不意味着「容易」或「没用」,Go 简单且固执己见的哲学在各方面都感受得到。

资料图示

Go 进行数据序列化与 Marshal 名称的起源

处理传递资料时都快忘了有「序列化与反序列化资料」这个步骤,因为都被套件像是:Axios 抽象掉了,近期在写后端也重新温习相关知识,也延续先前文章:Go Struct Tag 是什么?如何透过 reflect 动态处理栏位?探讨 Go 如何处理序列化资料。

堆疊图示

程式如何记忆:Stack 与 Heap

学习高阶程序语言通常都会接受一个观念是:「没用到的变量会自动被垃圾回收掉」。不过越接近底层或开始探讨性能问题,发现自己对于程序语言核心的记忆体概念 Heap 与 Stack 并没有那么清楚。程序语言究竟是如何分配与管理记忆体的?所谓的垃圾回收(Garbage Collection, GC)具体来说又做了哪些事情?

打勾圆圈图示

为什么需要双重因子验证(2FA)?

随着越来越多的软体推广与强制双重因子验证 2FA,我的手机也装上了 Google Authenticator,但老实说,很长一段时间我只知道「打开 App → 输入六位数字」,对于这组数字为什么会一直变、伺服器又是怎么验证的,其实没有真正了解过。直到最近在测试一些相关登入逻辑才回来补齐这块知识。

时间符号

程序中时间是如何计算与存储的?

我一直对程式中日期存在个模糊不可靠的概念,通常依靠方便的库像是:dayjs 去处理日期转换,但底层的原理至今仍不是很清楚,只知道时间是相对的,且存储方式可能是某种标准格式,这篇文章将尽可能补全程式处理时间所需要的知识。关于时区的规则与电脑运算存储时间的概念。

板手图示

Go 字符串处理使用 Rune

当在 Go 字串中索引位置 `n` 时,为什么没有得到第 `n` 个字元?相较于其他程式语言一串文字在遍历时会预期拿到单一个字符,在 Go 会拿到「Rune」;如果直接透过索引取得 string 内容会拿到 byte。透过实际解 Codewars 题目了解处理字串要留意的东西