随笔分类 - go
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
摘要:前言 在 Go 开发者日常工作中,经常会遇到需要同时使用多个 Go 版本的情况——比如项目依赖旧版本的特性、测试新版本的兼容性,或者团队成员使用不同版本。手动管理 Go 环境不仅麻烦,还容易导致环境污染和切换不便。这时,一款轻量级的命令行工具就能大幅提升效率。 GVM:Go 版本管理器安装与使用指南
阅读全文
摘要:问题排查指南 问题描述 执行 go run main.go 时出现以下编译错误: # github.com/go-playground/validator/v10 ../../../go/pkg/mod/github.com/go-playground/validator/v10@v10.20.0/
阅读全文
摘要:前言 在现代 Web 应用中,验证码是防止机器人攻击和恶意请求的重要手段。相比传统的图形验证码,滑动行为验证码具有更好的用户体验。本文将介绍如何使用 go-captcha 库在 Go 后端和 Vue 前端实现滑动验证码功能。 技术栈 后端:Go + Gin 框架 前端:Vue 3 + Element
阅读全文
摘要:GOMAXPROCS 决定: 同一时间最多有多少个 goroutine 可以并行运行(占用 CPU)。 更准确说: 它决定 P(Processor)的数量。 一、回忆一下 GMP 模型 我们之前讲过: G = goroutine(任务) M = 线程(干活的) P = 调度资源(必须持有才能执行 G
阅读全文
摘要:前言 goroutine 初始栈很小(≈2KB),但可以自动变大。 那它是怎么做到的? 一、先说结论 goroutine 的栈扩容是通过: 在函数调用前做“栈空间检查”,如果不够,就调用 runtime 进行扩容。 关键机制是: stack guard + morestack 二、goroutine
阅读全文
摘要:前言 很多人听说: goroutine 很轻,可以开几十万 但为什么轻?到底轻在哪里? 我们从 内存、创建成本、切换成本、调度方式 四个维度拆开讲清楚。 一、最核心的一句话 goroutine 轻,是因为它是用户态调度 + 小栈 + 自己管理切换。 而线程: 是内核调度 + 大栈 + 内核切换。 差
阅读全文
摘要:前言 “能抢占”和“频繁抢占”是两回事。 如果抢占太频繁,会导致: 上下文切换开销大 cache 失效 调度成本增加 性能下降 所以 Go 的设计目标是: 能抢占,但不会乱抢占。 我们一步步讲清楚它是怎么控制频率的。 一、核心原则:不是随时抢占,而是“时间片 + 条件触发” Go 不会在每一行代码都
阅读全文
摘要:一、什么是“抢占式调度”? 先理解什么是“抢占”。 非抢占式(早期 Go) 早期 Go(1.14 之前): goroutine 只有在 函数调用 channel 操作 syscall runtime 检查点 才会被切换。 如果一个 goroutine 写成: for { } 会发生什么? 👉 它永
阅读全文
摘要:一、为什么需要调度模型? 先问一个问题: Go 里可以同时开成千上万个 goroutine,它是怎么做到的? 如果每个 goroutine 都对应一个操作系统线程,那系统早就炸了。 因为: 线程很重(几 MB 栈空间) 创建销毁成本高 线程切换开销大 所以 Go 自己实现了一套“用户级调度器”。 二
阅读全文
摘要:前言 在Go开发中,我们经常需要将结构体转换为map[string]interface{}类型,特别是在: 调用第三方API时 动态处理JSON数据时 需要灵活修改字段时 解决方案 利用JSON作为中间格式,实现结构体到Map的转换: func (req *LLMReq) Data() (map[s
阅读全文
摘要:前言 Go 语言(Golang)发展迅速,经常需要切换不同版本来进行开发、测试或兼容旧项目。GVM(Go Version Manager,由 moovweb 开发)是一个经典的 Go 版本管理工具,它可以轻松安装、管理多个 Go 版本,并切换使用。 虽然 GVM 项目已不再活跃维护(最后更新在 20
阅读全文
摘要:根本原因 :表中的 file_size 列可能包含 NULL 值(例如,对于未设置文件大小的记录)。 SUM() 函数将 NULL 视为忽略(因此它仅对非 NULL 值求和),但如果所有相关 file_size 值均为 NULL, 则 SUM(file_size) 的结果将为 NULL。 Go 尝试
阅读全文
摘要:前言 go 语言,使用 gorm 查询,报错: sql: Scan error on column index 1, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time
阅读全文
摘要:实现思路 使用 GORM 连接数据库时,检查数据库是否存在。 如果数据库不存在,执行 SQL 语句创建数据库。 然后重新连接到新创建的数据库,并进行后续操作(如自动迁移表结构)。 package main import ( "fmt" "gorm.io/driver/mysql" "gorm.io/
阅读全文
摘要:前言 在使用 github.com/fvbock/endless 时,windows 平台报错: 原因 github.com/fvbock/endless 这个库用到了相关 syscall.SIGUSR1 和 syscall.SIGUSR2 信号,这些信号是 Unix/Linux 下的用户自定义信号
阅读全文
摘要:前言 go项目运行报错: import cycle not allowed,导入循环(import cycle) 报错原因,在Go语言中,两个或更多的包之间形成了相互依赖的关系,即A包导入了B包,而B包又反过来导入了A包,形成一个循环。 这种循环会导致编译器无法确定每个包的完整依赖图,因为它们互相引
阅读全文
摘要:乐观锁简介 乐观锁(又称乐观并发控制)是一种常见的数据库并发控制策略。 乐观并发控制多数用于数据竞争(data race)不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。 它的作用是防止并发更新数据库中的数据,从而避免
阅读全文
摘要:gin使用fvbock/endless gin 正常使用注册路由时: package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context)
阅读全文
摘要:在Go语言中,GOPATH 是一个环境变量,用于指定Go语言的工作空间路径。它是Go语言中一个重要的概念,用于管理和组织你的Go项目。 GOPATH 指定了Go语言的工作目录,它包含了三个重要的子目录:src、pkg 和 bin 。这些子目录分别用于存放源代码文件、编译后的包文件和可执行文件。 当你
阅读全文

浙公网安备 33010602011771号