API签名验证

背景 公司内部服务之间调用是,使用的签名如下: // 签名验证 func ValidateSignatureMiddleware(svc *service.Service) gin.HandlerFunc { return func(ctx *gin.Context) { ctxx := contextx.NewContextx(ctx, svc) if svc ...

Go 从os.Stdin读取数据的方式

在go语言中,从标准输入(os.Stdin)读取数据的常见方式有下面几种: 1. 使用fmt.Scan系列函数 fmt.Scan系列函数提供了简单的从标准输入读取数据的方法。 1.1 fmt.Scan 从标准输入读取由空白符(空格、制表符、换行符等)分隔的值,并将这些值保存到提供的参数中。 换行符被视为空白符,因此会忽略掉换行符继续输入。 返 ...

配置 IP 白名单的方式详解

在实际的生产环境中,为了保障系统的安全性,通常会通过IP白名单来限制访问来源,确保只有在白名单中的受信任的IP地址才能访问特定的服务。常见的IP白名单主要有以下的几种方式: 单个IP配置 CIDR表示法配置 通用IP段配置 通配符的配置 单个IP配置 这种方式用于指定固定的IP地址。在白名单中直接配置: 192.168.100.60 CI ...

记一次生成环境DEBUG过程

背景介绍 公司的一个公众号内嵌H5页面,用户在公众号内打开这个H5页面,点击页面的按钮打开微信小程序来领取优惠券。 运营反馈从昨天开始,用户点击打开小程序的按钮后没有反应,但是点击跳转h5的按钮可以正常跳转。而且时好时坏,并不是每次点击都无效。由于影响范围较大(公众号的主要功能受影响,受影响活跃用户在5w左右),所以进行了立即排查。 页面结构 H5的页面内部的主要逻辑是展示优惠 ...

Go语言接口实现断言技巧详解

在Go语言中,接口是一个非常重要的概念,用于定义一组行为的集合,任何实现了该接口方法集的类型都可以视为该接口的实现。在接口的使用过程中,有一种较为高级的技巧,即通过类型断言来确保某个类型实现了接口。这篇博客将详细介绍其中一种常用方式: var _ Buffer = (*StringBuffer)(nil) 这行代码看起来简单,却非常实用。在大型项目中,它可以帮助我们避免 ...

三元运算符

Go语言中并没有内置的三元运算符(类似a ? b : c),但可以通过定义一个泛型函数 Ter 来实现相同的效果。以下是详细的实现与使用示例。 实现三元运算符函数 在Go 1.18+版本中引入了泛型,允许定义泛型函数。Ter 函数的实现如下: // 三元运算符函数 func TerT any T { if cond { r ...

go中的等值比较

在编程过程中,我们经常需要比较两个值是否相等。go提供了丰富的数据类型,那么这些类型都是怎么进行等值比较的呢?下面我们来学习一下。 go中的数据类型 基本类型 整型 (int8, int16, int32, int64, int, uint8, uint16, uint32, uint64, uint, byte, rune) 浮点型 (fl ...

Redis Bitmap

什么是Bitmap 位图(Bitmap)是一种在计算机领域广泛使用的数据结构,主要用于高效地表示和操作大量布尔值(0或1)的集合。它通过利用位级运算的特性,将每个布尔值存储在一个二进制位(bit)中,从而实现了空间高效和运算高效的目标。 位图的基本原理是使用一个连续的位序列(一个位就是0或1)来表示一组元素的集合。每个元素在位图中对应一个固定的位位置,如果该位为1,则表示该元素存在于集 ...

VIM 替换命令

在服务器上经常会有文件内容部分或者全量替换的操作,下面我们来学习一下如何在vim编辑器里执行替换操作。 语法 替换命令的基本语法如下: :%s/要替换的文本/新文本/g 这个命令包括以下部分: :%s:表示对整个文档执行替换操作。 /要替换的文本:在这里指定你要查找和替换的文本。 /新文本:在这里指定你要替换成的新文本。 g ...

如何在服务器上显示中国时间

我们在搭建完服务器之后,默认的时区通常是Etc/UTC (UTC, +0000)。 Etc/UTC 是一个特殊的时区标识,代表协调世界时(Coordinated Universal Time,缩写为UTC)或格林威治标准时间(Greenwich Mean Time,缩写为GMT)。这是一个不考虑夏令时的时区,始终保持不变。 "+0000" 是与UTC时区关联的时区偏移值,表示该时 ...