- 博客(64)
- 收藏
- 关注
原创 Go 使用sync.Mutex或sync.RWMutex进行并发安全访问
使用RWMutex的时候,一旦调用了Lock方法,就不能再把该锁复制到其他地方使用,否则可能会出现各种问题。这是由于锁的状态(被哪个协程持有,是否已经被锁定等)是存储在RWMutex的结构体中,如果复制了RWMutex,那么复制后的RWMutex就会有一个全新的状态,锁的行为就会变得不可预测。sync.RWMutex是Go语言提供的一个基础同步原语,它是Reader/Writer Mutual Exclusion Lock的缩写,通常被称为"读写锁"。
2024-06-21 00:20:38 499
原创 Go go-redis应用
go-redis是 Go 语言的一个流行的 Redis 客户端库,它提供了丰富的功能来与 Redis 数据库进行交互。
2024-06-07 11:24:59 478
原创 19、Go Gin框架集成Swagger
浏览器直接访问项目+swagger路由:http://localhost:8080/swagger/index.html。需要导入,否则访问时会出错,因为有些静态资源都在该包目录下面。需要把swagger相关通过路由暴露出去,这样可以直接访问。main包中添加通用的API注释信息。::: deatils 完整示例。每次修改都需要执行改操作才能生效。15.5 项目启动访问。
2024-06-06 10:41:21 1389
原创 Go 优雅处理goroutines错误
在Go语言中,goroutines是轻量级的线程,它们在后台运行,可以并发执行任务。优雅地处理goroutines中的错误是确保程序稳定性和可维护性的关键。Go中goroutines通常通过channel来通信。你可以创建一个额外的channel来发送错误信息。
2024-06-06 10:20:59 505
原创 Go 项目中的 Goroutine 泄露及其防范措施
Goroutine 泄露类似于内存泄露,是指程序中创建的 Goroutine 没有正常退出,被无意义地保持存活,占用系统资源,可能最终导致资源耗尽,程序崩溃。Goroutine 泄露虽然不如内存泄露容易被直观察觉,但它对系统资源的影响同样严重。通过了解常见泄露原因、恰当使用上下文和超时机制、合理设计管道和定期检测 Goroutine 状态,我们可以有效地防范和修复 Goroutine 泄露问题,从而提高程序的稳定性和性能。
2024-06-05 15:21:44 1085
原创 Go 使用Base64Captcha生成数字字母验证码实现安全校验
Base64Captcha可以在服务端生成验证码,以base64的格式返回。
2024-06-04 15:35:45 460 1
原创 18、Go Gin框架中的binding验证器使用
Gin的binding包提供了一组功能,用于将请求的数据自动绑定到结构体,并根据结构体标签进行数据验证。常用的标签有binding和validate,通过这些标签可以指定数据的类型和验证规则。在上述示例中,我们定义了一个User结构体,并为每个字段添加了binding和validate标签,指定了各字段的绑定和验证规则。有时,内置的验证器无法满足我们的需求,我们可以定义自己的验证器。import ("fmt""net/http""strings""unicode"// User 结构体if!
2024-06-04 12:14:10 730
原创 Go GORM中的迁移系统,实现自动迁移与手动迁移
在数据库系统中,迁移是指对数据库架构进行变更的过程。例如:创建新的表或删除已有的表增加或删除表中的字段修改字段类型为字段添加或删除约束条件创建或移除索引迁移的目的是为了让数据库模式(Schema)跟随应用程序的需求变化而演化。因此,一个好的ORM框架应当提供便捷的迁移机制,来减少数据库变更带来的风险和工作量。
2024-06-04 11:25:28 881
原创 Go 在运维开发中的应用
Go语言(也称Golang)因其高效、简洁和强大的并发支持而在云计算和运维开发中变得非常受欢迎。:Go编译成机器代码,运行效率高,且内存占用少,适合高性能运维工具的开发。:Go内置goroutines和channels,简化了并发编程,适合开发需要高并发处理的运维工具。:Go语言编译生成静态二进制文件,无需依赖其他库,方便部署。:Go标准库提供了丰富的功能,可以快速开发运维工具。二、Go语言在运维开发中的实际应用。
2024-06-04 11:11:57 904
原创 Go 线程同步
通常在 Go 语言中有两种方法可以用来做线程同步sync.Condchannelchannel 的很好理解,当我们从一个 channel 中接收数据的时候,如果里面没有数据,那我们直接就阻塞在那里了。在 Go 语言中,如果你尝试在已经持有某个锁(例如sync.Mutex或)的情况下再次获取这个锁,这种行为被称为递归锁定或重入锁定。Go 的标准库中的sync.Mutex是不可递归的,这意味着你不能在已经持有该锁的 goroutine 中再次调用Lock()方法。如果尝试这样做,程序将导致死锁,因为。
2024-06-03 17:40:01 707
原创 Go Go-Simple-Mail包进行批量SMTP邮件发送
包提供了一种简便的方式来处理和发送邮件。这个包支持保持活动连接、TLS和SSL加密协议,非常适合批量SMTP邮件发送需求。
2024-06-03 12:38:30 516
原创 Go 雪花算法生成唯一ID(Snowflake)&分布式
实例时,你需要为每个节点配置一个不同的工作节点ID。这个ID通常在节点启动时配置,并在节点的整个生命周期内保持不变。:尽管雪花算法是线程安全的,可以在同一节点内被多个 Goroutine 安全地调用,但不同节点之间不应该共享同一个。:每个节点(或服务实例)都应该有一个唯一的工作节点ID(worker ID)。在使用 Go 语言实现的雪花算法(Snowflake)时,每个分布式系统中的节点通常都会有一个独立的。实例,并为其分配一个唯一的工作节点ID。实例会根据节点的配置生成唯一的ID。
2024-05-30 17:08:39 888
原创 Go 优雅的爬虫框架 - Colly
Colly 是一款用 Go 语言编写的优雅网络爬虫框架,速度快、灵活且易于使用配置可以写在里面,也可以写在外面。
2024-05-30 16:11:38 2279
原创 Go 错误日志处理
在编写Go代码时,请记住要么返回错误值,要么输出日志,不要两者都做。通过合理地处理错误,我们可以编写出更可靠、更易于调试的代码。
2024-05-28 17:15:54 511
原创 Go 使用 RabbitMQ---------------之一
RabbitMQ 是一种消息代理。消息代理的主要目的是接收、存储并转发消息。在复杂的系统设计和微服务架构中,RabbitMQ 经常被用作中间件来处理和转发系统之间的消息,以确保数据的一致性和可靠性。正是因为提供了可靠的消息机制、跟踪机制和灵活的消息路由,常常被用于排队算法、秒杀活动、消息分发、异步处理、耗时任务等场景。
2024-05-27 19:11:32 1360
原创 Go 使用 RabbitMQ---------------之二
在RabbitMQ中,无论是生产者和消费者实际上都属于Client。一个Client发送消息,哪些Client可以收到消息,其核心就在于Exchange(交换机),RoutingKey(路由键),Queue(队列)的关系上通过Channel声明Queue通过Channel声明Exchange(需指定Exchange type)创建Binding(指定一个BindingKey将Queue绑定到Exchange上)发送消息(需指定RoutingKey和Exchange)通过Channel声明Queue。
2024-05-27 15:08:46 480
原创 Go 实现 WebSocket 的双向通信
在Go语言中实现WebSocket的双向通信通常需要使用第三方库,其中。是一个非常流行和广泛使用的库。
2024-05-24 17:33:29 469
原创 16、Go Gin 深入理解Gin中间件
Gin框架允许开发者在处理请求的过程汇总,加入用户自己的钩子(Hook)函数这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑比如登录认证,权限校验、数据分页、记录日志、耗时统计等。
2024-05-24 15:40:54 240
原创 Go 高级日志记录库&集成Gin框架
将错误日志同时输出到文件首先,你需要定义一个实现了接口的结构体。Levels(), 和可选的。import ("os"// FileHook 将错误日志写入文件// NewFileHook 创建一个新的 FileHook 实例if err!= nil {// Levels 钩子关心的日志级别// Fire 当日志事件触发时被调用if err!= nil {return errreturn nil// 初始化日志// 创建并添加 FileHook} else {
2024-05-23 19:15:33 1982
原创 13、Go Gin集成Viper配置
在Go语言中,Gin是一个高性能的Web框架,而Viper是一个用于配置处理的库,它可以处理各种格式的配置文件,并且可以很容易地与Gin框架集成。
2024-05-23 16:12:48 429
原创 Go 控制协程(goroutine)的并发数量
选择哪种方法取决于具体的应用场景和需求。使用信号量是一种简单而灵活的方法,而协程池则更适用于需要批量处理任务的情况。包提供了一个标准库外的更灵活的信号量实现。
2024-05-23 15:06:35 1377
原创 Go 秒读32GB大文件
在Go中,处理大文件时,一般采用分块读取的方式,以避免一次性加载整个文件到内存中。使用os.Open打开文件使用file.Stat获取文件的基本信息,包括文件大小为了提高读取效率,使用合适大小的缓冲区使用file.Read循环读取文件内容。
2024-05-22 17:54:06 502
原创 Go GORM介绍
在 GORM 中,模型通常由 Go 结构体表示,每一个模型对应数据库中的一个表。gorm.ModelAge uint在上面的代码中,gorm.Model是一个包含了 ID, CreatedAt, UpdatedAt, DeletedAt 字段的基础模型。我们在此基础上添加了自定义字段(Name, Age, Active)。
2024-05-22 15:46:52 1054
原创 Go 实现程序优雅退出
在Go语言中,实现程序的优雅退出是一项重要的任务,特别是在涉及到HTTP服务器、gRPC服务器、以及其他后台工作的情况下。
2024-05-21 19:14:30 780
原创 Go 生成UUID唯一标识
因为使用了随机性,理论上只要随机数生成器是真随机的,生成的UUID就有极高的概率是唯一的。这是最常用的版本,尤其是在不需要基于时间或硬件特征的情况下。由于时间戳确保了随时间的递增,而MAC地址理论上是全球唯一的,两者的组合通常能确保UUID的唯一性。只要命名空间和名字的组合是唯一的,生成的UUID也是唯一的。这依赖于输入数据的唯一性。UUID的目的,是让分散式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。这也需要命名空间和名字的唯一性来保证UUID的唯一性。
2024-05-21 18:04:29 986
原创 Go 使用bcrypt实现密码加密和和校验
在Go语言中,使用bcrypt算法进行密码的加密和校验是一种常见的做法,因为bcrypt算法可以提供强大的密码安全性。
2024-05-21 16:36:19 531
原创 Go Excel的处理
Excelize 是一个强大的库,支持复杂的Excel操作,包括样式、图片等。首先,确保你已经安装了Excelize库。对于简单的Excel导出需求,
2024-05-17 16:57:07 240
原创 12、Go Gin使用JWT实现认证机制
JWT是JSON Web Token的缩写,是一种跨域认证的解决方案。import ("log"return nil//密钥Username: "小明",Gender: "男",if err!= nil {log.Fatal("签署JET时错误", err)在自定义结构中使用JWT标准中定义的字段*jwt.StandardClaims//标准字段。
2024-05-15 17:18:41 2173
原创 Go GORM实战(二) | 数据库连接的N种方式
另外,连接SQLite数据库时,也可以在内存中创建临时数据库,而需要一个实际的数据库,SQLite 允许您使用特殊的语法来创建一个基于内存的数据库,这个数据库不会持久化到磁盘上,而是存储在内存中,基于内存的数据库在程序结束时会自动销毁,所有数据都会丢失。因为SQLite数据库其实只是一个文件而已,所以SQLite的连接非常简单,只需要传入SQLite数据库的文件路径即可,比如我们连接一个在当前目录的gorm.db数据。会创建一个新的基于内存的数据库,每次程序运行时都会重新创建。和对应数据库的驱动库,如。
2024-05-15 14:33:42 1498
原创 Go GORM实战(一) | 简单的增删改查
GORM是一个非常优秀的Golang数据库ORM库,支持MySQL, PostgreSQL, SQlite, SQL Server等数据库。
2024-05-15 11:36:11 854
原创 Go 反射 reflect
Go 语言的reflect包是一个非常强大的工具,它允许程序在运行时检查和处理其他对象的结构。使用reflect,你可以获取类型的信息,调用方法,以及读写结构体字段,即使这些信息在编译时是未知的。
2024-05-14 19:21:08 384
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人