别让数据库靠手改:Go golang-migrate 从版本脚本到生产发布详解
摘要:简介 业务代码有 Git 记录,数据库结构也应该有版本记录。 没有迁移工具时,数据库变更经常变成这样: 本地手动加了一个字段 测试环境忘了建索引 生产环境不知道跑到哪个版本 上线失败后不知道怎么回滚 多人同时改表,脚本顺序互相打架 golang-migrate 解决的就是这个问题。 它把每次数据库结
阅读全文
posted @
2026-08-07 07:56
我是唐青枫
阅读(27)
推荐(0)
别把 GORM 当 SQL 生成器:Go GORM 从模型映射到事务实战详解
摘要:简介 Go 访问数据库有两条常见路线。 一条是标准库 database/sql: rows, err := db.QueryContext(ctx, "select id, name from users where status = ?", "active") if err != nil { re
阅读全文
posted @
2026-08-06 17:32
我是唐青枫
阅读(7)
推荐(0)
别把 CLI 写成一坨 os.Args:Go Cobra 从命令树到实战工具详解
摘要:简介 Go 标准库当然可以写命令行工具: package main import ( "fmt" "os" ) func main() { if len(os.Args) < 2 { fmt.Println("缺少命令") return } switch os.Args[1] { case "ver
阅读全文
posted @
2026-07-09 07:47
我是唐青枫
阅读(15)
推荐(0)
别再只会 if err != nil:Go error 从错误链到工程实战详解
摘要:简介 Go 代码里最常见的错误处理大概是这样: result, err := doSomething() if err != nil { return err } 这几行代码不难,真正容易出问题的是后面的选择: 应该新建错误,还是包装原错误? 应该使用 ==,还是 errors.Is? 什么时候需要
阅读全文
posted @
2026-07-04 07:47
我是唐青枫
阅读(14)
推荐(0)
别再把类型断言当强制转换:Go 从 comma-ok 到 type switch 实战详解
摘要:简介 Go 代码里经常能看到这样的写法: name, ok := value.(string) 表面看起来像类型转换,实际含义完全不同。 类型转换是在两个允许转换的类型之间改变值的类型: n := int64(100) 类型断言则是在检查一个接口值: 接口里当前装的值,能不能当成目标类型使用? 类型
阅读全文
posted @
2026-07-02 11:22
我是唐青枫
阅读(17)
推荐(0)
别把泛型写复杂了:Go generic 从类型参数到实战封装
摘要:简介 generic 通常翻译成“泛型”。 Go 从 1.18 开始支持泛型。 泛型解决的核心问题很直接: 同一套逻辑,适配多种类型,同时保留编译期类型检查。 比如求和。 没有泛型时,int 要写一份: func SumInts(nums []int) int { var total int for
阅读全文
posted @
2026-06-29 08:06
我是唐青枫
阅读(16)
推荐(0)
别再怕指针:Go pointer 从地址到实战用法
摘要:简介 pointer 是 Go 里绕不开的基础概念。 中文通常叫“指针”。 它的作用很简单: 保存一个变量的内存地址,然后通过这个地址访问或修改变量。 先看一个最小例子: a := 10 p := &a 这里: a 是普通变量,值是 10 &a 是 a 的地址 p 是指针变量,保存了 a 的地址 *
阅读全文
posted @
2026-06-16 09:52
我是唐青枫
阅读(20)
推荐(0)
别再把 struct 只当字段集合:Go 结构体从语法到项目实战
摘要:简介 struct 是 Go 里最重要的复合类型之一。 它用来把多个字段组合成一个整体。 比如一个用户有 ID、名称、邮箱、年龄: type User struct { ID int Name string Email string Age int } 这段代码表达的是: User 是一个结构体类型
阅读全文
posted @
2026-06-11 22:11
我是唐青枫
阅读(6)
推荐(0)
别再把 make 和 new 搞混:Go make 从切片到通道实战详解
摘要:简介 make 是 Go 里的内置函数,专门用来创建并初始化三种类型: slice map channel 语法大概长这样: make(Type, args...) 常见写法: s := make([]int, 0, 10) m := make(map[string]int) ch := make(
阅读全文
posted @
2026-06-07 18:01
我是唐青枫
阅读(13)
推荐(0)
别再把 new 当构造函数:Go new 从零值指针到实战用法
摘要:简介 new 是 Go 里的内置函数,作用很简单: 给某个类型分配一块零值内存,然后返回这块内存的指针。 语法如下: p := new(Type) 比如: p := new(int) 这行代码会得到一个 *int 类型的指针,指针指向的值是 int 的零值,也就是 0。 一句话概括: new(T)
阅读全文
posted @
2026-06-06 10:31
我是唐青枫
阅读(13)
推荐(0)
Go slice切片使用教程,一次通关!
摘要:简介 Go 中的 切片(slice) 是 Go 最强大、最常用的数据结构之一。它是对数组的轻量封装,比数组更灵活,几乎所有的集合处理都用切片来完成。 什么是切片(slice) 切片是一个拥有 长度(len)和容量(cap) 的 动态数组视图。底层是一个数组,但可以动态扩容、共享数组。 var s [
阅读全文
posted @
2025-04-23 07:19
我是唐青枫
阅读(237)
推荐(0)
如何用Go写一个benchmark 解析器及Web UI 数据可视化?
摘要:简介 用 Go 编写的 benchmark 输出解析器,功能如下 读取 go test -bench=. -benchmem 的输出文件(如 benchmark.txt) 解析出每行数据 写入成 CSV 文件(如 benchmark.csv) Web UI 可视化数据 仅Go解析器 package
阅读全文
posted @
2025-04-11 07:16
我是唐青枫
阅读(50)
推荐(0)
Go 字符串四种拼接方式的性能对比
摘要:简介 使用完整的基准测试代码文件,可以直接运行来比较四种字符串拼接方法的性能。 for 索引 += 的方式 for range += 的方式 strings.Join 的方式 strings.Builder 的方式 写一个基准测试文件 echo_bench_test.go package main
阅读全文
posted @
2025-04-10 06:11
我是唐青枫
阅读(42)
推荐(0)