gocookbook icon indicating copy to clipboard operation
gocookbook copied to clipboard

go cook book

Results 90 gocookbook issues
Sort by recently updated
recently updated
newest added

单例模式,分两种加载模式,下面介绍下 Go 里面怎么使用单例模式。 ## 饿汉模式 适合程序初始化时就确定怎么加载实例的情况 ```go package singleton // Singleton 饿汉式单例 type Singleton struct{} var singleton *Singleton func init() { singleton = &Singleton{} } // GetInstance 获取实例 func GetInstance()...

## Go 优雅处理错误的几种方案 在 Go 语言官方库 `bufio` 中 `Scanner`对象的错处处理的实现方式可以给我们一点启发,它大概是这么实现的。 ```go scanner := bufio.NewScanner(input) for scanner.Scan() { token := scanner.Text() // process token } if err := scanner.Err(); err != nil...

在编程领域里,枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机。拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应。 在刚开始学编程的时候,你一定写过,至少见过直接使用魔术数字进行判断的代码。啥叫魔术数字呢,举个例子,要置顶一个文章的时候先判断文章是不是已发布状态。 ```java if (article.state == 2) { // state 2 代表文章已发布 } ``` 假如我们的代码里没有注释,或者等我们项目的代码里充斥着这些魔术数字的判断的时候,你是不是会很头疼? 后来我就学会了把这些状态值定义成常量,并且也搞一个判断对象状态的方法单独封装这段逻辑。 ```java public class ArticleState { public static final int Draft = 1; //草稿 public...

不多解释,直接看代码~~ ```go const lotteryBase = 10000 type LotteryPrize struct { Id int64 // 奖品ID Name string // 奖品名 Rate float64 // 中奖概率 Type int8 // 自行配置,比如实物奖、虚拟奖、谢谢惠顾之类的 probability int64 // 概率数...

在 Go 单元测试这个系列的第二部分 [数据库的Mock测试](https://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU2MA==&mid=2247493173&idx=1&sn=ef47fc8591a1976e0e254ed76cb1e144&chksm=fa8337a2cdf4beb45a1b55c0e231fa3f340afc4d37f590b237faedce720e2a0a51ae7c2d50a9&token=363190209&lang=zh_CN#rd) 中我们介绍了用 `go-sqlmock` 给数据库的 CRUD 操作做Mock 测试的方法,不过里面只是讲解了一下怎么对原生的`database/sql`执行的 SQL 进行 Mock 测试。 ## 前言 真实的开发场景下我们的项目一般都会使用 ORM ,而不是原生的`database/sql`来完成数据库操作。在很多使用ORM工具的场景下,也可以使用`go-sqlmock`库 Mock数据库操作进行测试,今天这篇内容我就以 GORM 为例,讲解怎么给项目中的 ORM 数据库操作做单元测试。 ## 项目准备 为了场景足够真实,我用 2020 年我更新的 「[Go...

>转载自:https://www.liwenzhou.com/posts/Go/golang-unit-test-6/ 示例代码原作者已上传至Github,点击👉🏻https://github.com/Q1mi/golang-unit-test-demo 查看完整源代码。 这个系列中已经介绍了很多 Go 单元测试的技能和工具,在这一篇中我们不再介绍编写单元测试的工具而是专注于如何编写可测试的代码。 ## 编写可测试的代码 编写可测试的代码可能比编写单元测试本身更加重要,可测试的代码简单来说就是指我们可以很容易的为其编写单元测试代码。编写单元测试的过程也是一个不断思考的过程,思考我们的代码是否正确的被设计和实现。 接下来,我们将通过几个简单示例来介绍如何编写可测试的代码。 ### 剔除干扰因素 假设我们现在有一个根据时间判断报警信息发送速率的模块,白天工作时间允许大量发送报警信息,而晚上则减小发送速率,凌晨不允许发送报警短信。 ```go // judgeRate 报警速率决策函数 func judgeRate() int { now := time.Now() switch hour := now.Hour(); { case...

golang中map是引用类型,应用类型的变量未初始化时默认的zero value是nil。直接向nil map写入键值数据会导致运行时错误`panic: assignment to entry in nil map` 看一个例子: ``` package main const alphabetStr string = "abcdefghijklmnopqrstuvwxyz" func main() { var alphabetMap map[string]bool for _, r := range alphabetStr...

>转载自:https://www.liwenzhou.com/posts/Go/golang-unit-test-3/ 示例代码原作者已上传至Github,点击👉🏻https://github.com/Q1mi/golang-unit-test-demo 查看完整源代码。 这是Go语言单元测试从零到溜系列教程的第5篇,介绍了如何在单元测试中使用monkey进行打桩。 在上一篇[《Go单元测试--Mock接口实现和对接口打桩》](https://mp.weixin.qq.com/s/grPERmezORRTUv29sCbxEg)中,我们介绍了如何在单元测试中使用`gomock`和`gostub`工具mock接口及打桩。 在这一篇中我们将介绍一个更强大的打桩工具——`monkey`,它支持为任意函数及方法进行打桩。 ## monkey ### 介绍 monkey是一个Go单元测试中十分常用的打桩工具,它在运行时通过汇编语言重写可执行文件,将目标函数或方法的实现跳转到桩实现,其原理类似于热补丁。 monkey库很强大,但是使用时需注意以下事项: - monkey不支持内联函数,在测试的时候需要通过命令行参数`-gcflags=-l`关闭Go语言的内联优化。 - monkey不是线程安全的,所以不要把它用到并发的单元测试中。 ### 安装 ``` go get bou.ke/monkey ``` ### 使用示例 假设你们公司中台提供了一个用户中心的库`varys`,使用这个库可以很方便的根据uid获取用户相关信息。但是当你编写代码的时候这个库还没实现,或者这个库要经过内网请求但你现在没这能力,这个时候要为`MyFunc`编写单元测试,就需要做一些mock工作。 ```go // func.go func...

一个结构体类型的尺寸取决于它的各个字段的类型尺寸和这些字段的排列顺序。为了程序执行性能,编译器需要保证某些类型的值在内存中存放时必须满足特定的内存地址对齐要求。 地址对齐可能会造成相邻的两个字段之间在内存中被插入填充一些多余的字节。 所以,一个结构体类型的尺寸必定不小于(常常会大于)此结构体类型的各个字段的类型尺寸之和。 ### 为什么需要内存对齐 操作系统并非一个字节一个字节访问内存,而是按2, 4, 8这样的字长来访问。因此,当CPU从存储器读数据到寄存器,或者从寄存器写数据到存储器,IO的数据长度通常是字长。如 32 位系统访问粒度是 4 字节(bytes),64 位系统的是 8 字节。 当被访问的数据长度为 n 字节且该数据地址为n字节对齐,那么操作系统就可以高效地一次定位到数据,无需多次读取、处理对齐运算等额外操作。 数据结构应该尽可能地在自然边界上对齐。如果访问未对齐的内存,CPU需要做两次内存访问。  关于内存对齐的一些解释文章: [我的公众号文章--详解Go 的内存对齐](https://mp.weixin.qq.com/s/l3T5p_iw3S9nm635ezflGQ) https://t.1yb.co/fgor https://xie.infoq.cn/article/594a7f54c639accb53796cfc7 https://www.cnblogs.com/-wenli/p/12681044.html https://ms2008.github.io/2019/08/01/golang-memory-alignment/ https://eddycjy.gitbook.io/golang/di-1-ke-za-tan/go-memory-align

>转载自:https://www.liwenzhou.com/posts/Go/golang-unit-test-3/ >示例代码原作者已上传至Github,点击👉🏻https://github.com/Q1mi/golang-unit-test-demo 查看完整源代码。 这是Go语言单元测试从零到溜系列教程的第4篇,介绍了如何在单元测试中使用gomock和gostub工具mock接口和打桩。 在上一篇[《Go单元测试 — 数据库 CRUD 的 Mock 测试》](https://mp.weixin.qq.com/s/D_MdLEbF63BWhYgMiyPZhw)中,我们介绍了如何使用`go-sqlmock`和`miniredis`工具进行数据库测试。 除了网络和数据库等外部依赖之外,我们在开发中也会经常用到各种各样的接口类型。本文就举例来演示如何在编写单元测试的时候对接口类型进行mock以及如何进行打桩。 ## gomock [gomock](https://github.com/golang/mock)是Go官方提供的测试框架,它在内置的testing包或其他环境中都能够很方便的使用。我们使用它对代码中的那些接口类型进行mock,方便编写单元测试。 ### 安装mockgen > 互联网开源库更新迭代比较快,建议直接查看官方文档:https://github.com/golang/mock 首先需要确保你的`$GOPATH/bin`已经加入到环境变量中。 Go版本号=1.16时: ```bash go install github.com/golang/mock/[email protected] ``` 如果是在你的CI流水线中安装,则需要安装与你的CI环境匹配的合适版本。 ### 运行mockgen `mockgen`...