随笔分类 - go
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
摘要:前言 在 Go 开发中,遇到多层嵌套的结构体、map、slice 时,fmt.Println 的输出往往一团乱,很难快速看清结构。 下面介绍两个轻量好用的打印包,用简单代码示例帮你快速上手。 1. k0kubun/pp —— 彩色美观打印 安装: go get github.com/k0kubun/
阅读全文
摘要:前言 某天重启服务,日志里蹦出这么一行错误: Error 1069 (42000): Too many keys specified; max 64 keys allowed ALTER TABLE `xxx_table` MODIFY COLUMN `some_field` varchar(64)
阅读全文
摘要:前言 最近给后端项目接入了一套 OAuth2 授权服务器(Authorization Server),踩了一些坑,也去掉了一个过度设计的页面——服务端渲染的授权确认页。这篇文章把最终定型的方案讲透,不贴具体业务代码,你照着做,系统半小时就能接完。 目标读者:已经有一套基于 Gin + GORM 的后
阅读全文
摘要:前言 在使用 GORM 开发 Go 项目时,经常需要查看实际执行的 SQL 语句——排查慢查询、调试数据逻辑、确认查询条件是否正确……但 GORM 默认是关闭的,不会主动把 SQL 打印出来。 方式一:全局开启 Debug 模式(最简单) GORM 提供了一个非常方便的方法——db.Debug(),
阅读全文
摘要:前言:一行看似无害的 defer 最近在维护一个 Go + GORM 写的服务,用户注册成功后要往日志表里写几条记录。 代码大概长这样: return DB.Transaction(func(tx *gorm.DB) error { if err := tx.Create(user).Error;
阅读全文
摘要:前言 Go 语言在 1.18 版本 正式引入了泛型(Type Parameters),这是 Go 语言近十年里最大的一次语法升级。它解决了长期以来困扰 Go 开发者的“类型安全与代码复用不可兼得”的核心矛盾。 一、为什么 Go 需要泛型? 在 Go 1.18 之前,开发者常常面临以下痛点: 大量重复
阅读全文
摘要:什么是 CORS? 想象一下这个场景: 你的前端网站运行在 http://localhost:3000 你的后端 API 运行在 http://localhost:8080 当前端尝试调用后端 API 时,浏览器突然报错:Access to fetch at 'http://localhost:80
阅读全文
摘要:前言 在 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 尝试
阅读全文

浙公网安备 33010602011771号