分类 golang 中的文章

Go如何控制并发请求数

仅仅限制并发数 var limit = make(chan int, 300) func main() { // ………… for _, w := range work { go func() { limit <- 1 w() <-limit }() } // ………… } 控制单位时间内并发数 可以通过使用 time.Tick 和 sync.WaitGroup 来控制每秒请求并发数。 具体实现方法如下: const maxQPS = 100 // 每秒最大请求数 func main() { qpsInterval := time.Second / time.Duration(maxQPS) // 每个请求的时间间隔 var wg sync.WaitGroup ticker := time.Tick(qpsInterval) for i := 0; i < 1000; i++ { wg.Add(1) <-ticker // 等待下一个请求时间……

阅读全文

Golang 为什么nil != nil

摘自go官网 Frequently Asked Questions Why is my nil error value not equal to nil? Under the covers, interfaces are implemented as two elements, a type T and a value V. V is a concrete value such as an int, struct or pointer, never an interface itself, and has type T. For instance, if we store the int value 3 in an interface, the resulting interface value has, schematically, (T=int, V=3). The value V is also known as the interface’s dynamic value, since a given interface variable might hold different values V (and corresponding types T) during the execution of the program. An interface value is nil only if the V and T are both unset, (T=nil, V is not set), In particular, a nil interface will always hold a nil type. If we store a……

阅读全文

Gin参数校验

Gin 使用了结构体标签(struct tags)的方式来定义参数校验规则。以下是一个使用 Gin 进行参数校验的示例: 首先,定义一个结构体类型来表示请求参数: type CreateUserRequest struct { Name string `json:"name" binding:"required"` Email string `json:"email" binding:"required,email"` Password string `json:"password" binding:"required,min=8"` } 在上述示例中,使用了 binding 结构体标签来指定参数校验规则。binding:"required&qu……

阅读全文

Golang中的信号处理

信号类型 每个平台的信号定义或许有些不同。下面列出了POSIX中定义的信号。 Linux 使用34-64信号用作实时系统。 命令 man signals 提供了官方的信号介绍。 在POSIX.1-1990标准中定义的信号列表 信号 值 动作 说明 SIGHUP 1 Term 终端控制进程结束(终端连接断开) SIGINT 2 Term 用户发送INTR字符(Ctrl+C)触……

阅读全文

Golang一致性哈希实现

概念 一致性哈希是指将数据分散到多个节点上进行存储的方法。在一致性哈希中,数据通常用数字编码,并使用哈希函数将它们映射到一个固定的哈希环上。在这种情况下,哈希环的大小通常是 2 的某个次方。选择 2 的 32 次方作为哈希环的大小是因为这是一个较大的数字,能够在哈希环上映射到许多不同的点,从而提……

阅读全文

Golang testify学习

摘要:Go 语言的测试框架 testify 是一个功能丰富且易于使用的工具集,旨在帮助开发者编写高质量的测试代码。 本文将深入介绍 testify 的主要组件,包括断言库 assert、测试工具集 suite 和模拟对象库 mock,并讨论如何充分利用 testify 提升测试覆盖率和可维护性。 引言 在软件开发中,测试是确保代码质量和稳定性的重要环……

阅读全文

Go Test代码覆盖率

go test -v -cover 执行单元测试并计算覆盖率 go test 工具可以用来测试 单元测试的代码覆盖率,示例如下: $ go test -v -cover === RUN TestSum --- PASS: TestSum (0.00s) === RUN TestAbs --- PASS: TestAbs (0.00s) PASS coverage: 85.7% of statements ok gotest 0.005s 从覆盖率来看(coverage: 85.7% of statements),测试用例没有覆盖全部的代码,只有 85.7% ,可以通过如下命令将 cover 的详细信息保存到 cover.out 中。 $ go……

阅读全文

Golang Context的使用方式

context 是 go 中控制协程的一种比较方便的方式。 Select + Chan 我们都知道一个 goroutine 启动后,我们是无法控制他的,大部分情况是等待它自己结束,那么如果这个 goroutine 是一个不会自己结束的后台 goroutine 呢?比如监控等,会一直运行的。 这种情况下比较笨的办法是全局变量,其他地方通过修改这个变量完成结束通知,然后后台 goroutine 不停的检查这……

阅读全文

Golang 测试基础

如今的软件复杂性,给开发带来了大量的精力,有两个方式可以有效缓解这个问题:软件发布之前的同行评审(业务、产品、技术)、以及软件有效的测试(自动化测试) Go 基于轻量级的测试方式,基于 go 工具链以及相关的函数进行,同时测试还涉及压力测试和文档示例 1. 测试基础 1.1. *_test 文件 go test扫描以*_te……

阅读全文

Golang格式化输出备忘

Go 中格式化输出 General %v 以默认的方式打印变量的值 %T 打印变量的类型 Integer %+d 带符号的整型,fmt.Printf(“%+d”, 255)输出+255 %d 不带符号的整形,注意和 %+d 的区别。 %o 不带零的八进制 %#o 带零的八进制 %x 小写的十六进制 %X 大写的十六进制 %#x 带 0x 的十六进制 %U 打印 Unicode 字符 %#U 打印带字符的 Unicode %b 打印整型……

阅读全文