Golang

Go深度指南:从基础到高级的全面解析

Go 语言自推出以来,因其简洁性、并发支持和高效性能,在云计算、微服务和分布式系统中广泛应用。作为开发者,面试时往往需要面对一系列技术问题,这些常被称为“八股文”的题目,虽然有时显得高级特性,力求每个解释都严谨实用,避免空话套话。让我们从最基础的部分开始。 第一章:基础概念与语法 变量与类型系统 Go 是静态类型语言,类型安全且编译时检查。变量声明使用 var 关键字,或短变量声明 :=。基础类型包括整型、浮点型、布尔型和字符串等。理解零值概念至关重要:未初始化的变量会赋予其类型的零值,例如整型为 0,字符串为空字符串””。 类型转换必须是显式的,Go 不支持隐式类型转换。例如,将 int 转换为 float64 需要使用 float64(x)。这有助于避免意外错误。 控制结构 Go 的控制结构包括 if、for、switch 等,设计简洁。for 循环是唯一的循环结构,但可以模拟 while 循环。if 语句可以包含初始化语句,增强可读性。 switch 语句在 Go 中更为灵活,case…

Go 语言文件处理

文件处理是 Go 语言中最常见的操作之一——读取配置、写入日志、数据持久化都离不开它。Go 的标准库提供了一套简洁而强大的文件 I/O 接口,覆盖从单次读写到流式处理的各种场景

Go 文件和文件夹工具类:一个开箱即用的 fileutil 包v2

基于 Go 1.25 的新特性,我将之前的工具包进行了全面重构和升级。 新版主要引入了 os.Root 保障文件操作安全,使用迭代器和泛型提升代码的现代感与复用性,并整合了 testing/fstest 优化测试体验。 一、新版 fileutil 包代码 二、使用示例 三、关键优化点详解 希望这个融合了 Go 新特性的工具包能让你的开发工作更高效、更安全。

 Go 开发经验总结:从入门到写出生产级代码

用 Go 语言写后端已经好多年了。从最初被 if err != nil 烦到不行,到现在能熟练应对各种并发场景和代码组织,踩过不少坑,也有一些心得。这篇文章把这些经验整理下来,希望能帮到正在用 Go 的朋友。每个主题都会配上可直接运行的代码示例,你可以边看边跑。 1. 错误处理:不止是 if err != nil 很多刚接触 Go 的人都会被满屏的 if err != nil 吓到。但真正的问题是,很多人只检查了错误,却没做好错误包装和分类。 1.1 用 %w 包装错误,保留上下文 Go 1.13…

使用Go语言实现Redis分布式锁(附有看门狗自动续期机制)

Redis我们日常开发经常使用,而分布式锁的一个重要实现就是通过Redis完成,分布式锁要解决的核心问题是防止对某个资源进行重复或者过度请求,例如我们在分布式系统中创建订单之前,必须获取分布式锁才能创建订单,其要解决的主要问题有两个: 1)如果用户重复点击提交订单按钮,可以通过分布式锁避免重复创建订单 2)商品库存有限,通过分布式锁能够解决超卖问题 Redis实现分布式锁 由于Redis中set nx命令的原子性,只有在键值不存在的时候才能设置值,因此可以通过set nx实现分布式锁,但是它有弊端就是: 如果业务还没有执行完,那么会导致业务没有执行完,锁就被释放了 因此延伸出了基于Redis延伸的Redisson分布式锁框架,它实现的原理在于使用Redis单线程模型执行SET NX命令lua脚本确保获取锁操作原子性,同时它内置了更为丰富的看门狗机制,满足了在业务执行过程中,自动续期锁 Go语言实现分布式锁 上面都是基于理论介绍,接下来就实现基于Redis的分布式锁 明确原子性操作 在实现之前,我们要明确加锁、释放锁与续期锁的机制: 加锁:设置键值与过期时间,通过setnx px实现,如果键值已经存在直接返回错误 释放锁:我们一定要确保释放的锁是自己加的锁,因此要判断value值是否是之前设置的value值,只有判断正确才能够释放锁 续期锁:与释放锁同理,只有当前锁是自己加的锁才续期 完整测试用例: 测试依赖 miniredis 模拟 Redis 服务,请先安装: 测试文件:mutex_test.go 运行测试 -race 标志会启用数据竞争检测,确保并发安全。 注意事项

Go 文件和文件夹工具类:一个开箱即用的 fileutil 包

在日常开发中,文件与目录操作是高频需求。虽然 Go 标准库已经提供了 os、path/filepath 等基础能力,但直接使用仍需处理大量边界条件。本文将封装一个实用的 fileutil 工具包,涵盖常用操作:路径存在判断、目录创建、文件复制、目录复制、移动、删除、遍历、大小统计等。每个方法都有详细的注释和错误处理,可直接集成到项目中。 完整代码可在文末获取,或直接复制使用。 功能概览 核心代码:fileutil 包实现 使用示例 要点说明 函数 注意事项 CopyFile 覆盖已存在的目标文件;保留源文件权限 MoveFile 跨文件系统自动降级为复制+删除 CopyDir 递归复制,目标目录存在时会合并内容 SafeWrite 原子写入,先写临时文件再 rename,防止写一半时进程崩溃导致数据损坏 ListFiles 支持按扩展名过滤,返回绝对路径 EnsureDir 已存在但不是目录时报错,避免误用 这个工具包覆盖了日常开发中 90%…

golang 重要知识:golang 调度

摘要 Go 的调度机制相当于我们微服务里的基础组件。很多运行时操作都涉及到了调度的关联。本文会细聊调度概念,策略,以及它的机制。当然,也少不了最常提及的 GMP 模型。 一、调度是什么? 计算机的资源是有限的,像 CPU,内存都是固定的。但是同一时间可能会有多个任务要去完成,比如操作系统的定时监控,用户程序的运行等。 怎么让资源最大化的完成任务,这是调度需要考虑的关键点。 调度可以理解为一个指挥员,指导我们的程序按照一定的规则去获取资源,然后去执行里面的指令。 调度分配 那么,一般的规则有哪些呢? 常见的调度策略有 2 种,一种是协作式调度,会让程序顺利的完成自己的任务,再把资源腾出来给其他程序使用。 另一种是抢占式调度,也就是让程序按一定的时间去占有这些资源,时间到了就被迫让出现有资源,给其他的程序轮流使用。 协作式调度有利于程序专注的完成自己的任务,但也可能会造成其他程序一直饿死,得不到执行。 协作式调度 抢占式调度有利于程序在资源的利用上雨露均沾,但是在不断的切换过程中,将会使得程序原本 10 ms 能完成的事,不得不延迟多几 ms。 抢占式调度 注:Linux 操作系统也是采用了抢占式调度,并且使用了 CFS:完全公平调度算法。通过对程序大致的运行时间来平衡调度,让越没有执行过的程序,越快被调度到。 当前大多数操作系统都是采用抢占式调度来执行程序的,毕竟很多操作系统都是面向用户,需要很高的响应速度,而且只要切换程序的周期够短,例如 50ms,那对于用户来讲,就像没切换一样。 二、golang…

深度解密 Go 语言之 context

Go 语言的 context 包短小精悍,非常适合新手学习。不论是它的源码还是实际使用,都值得投入时间去学习。 这篇文章依然想尝试全面、深入地去研究。文章相比往期而言,整体不长,希望你看完可以有所收获! 什么是 context Go 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。 随着 context 包的引入,标准库中很多接口因此加上了 context 参数,例如 database/sql 包。context 几乎成为了并发控制和超时控制的标准做法。 context.Context 类型的值可以协调多个…