必须用go 1.15+初始化项目并安装iris v12,执行go mod init myapp后go get github.com/kataras/iris/v12@latest,再补go mod tidy;最小服务需调用app.listen,gorm应全局注入并通过ctx.values获取。

初始化项目并安装 Iris v12
必须用 Go 1.15+,否则 go get 会失败或引入不兼容依赖。直接运行命令即可,无需手动建模块——go mod init 应该在 go get 前完成:
go mod init myappgo get github.com/kataras/iris/v12@latest
注意:@master 已不推荐,官方稳定发布版走 @latest 或指定语义化版本(如 @v12.2.0)。如果 go.mod 中出现 // indirect 标记的大量间接依赖,说明你跳过了 go mod tidy ——务必补上,否则构建时可能缺包。
写一个能跑起来的最小 HTTP 服务
别一上来就搞 MVC 或中间件,先验证框架是否真能响应请求。以下是最简 main.go:
package main
import "github.com/kataras/iris/v12"
func main() {
app := iris.New()
app.Get("/ping", func(ctx iris.Context) {
ctx.JSON(iris.Map{"message": "pong"})
})
app.Listen(":8080")
}
常见卡点:
- 忘记启动
app.Listen,程序静默退出 - 端口被占用却没看错误日志,
Listen返回 error 被忽略 - 用
ctx.WriteString但没设Content-Type,前端收到纯文本而非 JSON
接入 GORM 实现基础数据库操作
Iris 本身不绑定 ORM,GORM 是最常用搭配。关键不是“怎么连”,而是“什么时候连、谁来管生命周期”:
推荐在 main() 初始化 GORM 实例后,通过 app.RegisterValue 注入全局可访问的 *gorm.DB:
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
app.RegisterValue((*gorm.DB)(nil), db)
然后在 handler 里取用:
app.Get("/users", func(ctx iris.Context) {
db := ctx.Values().Get("*gorm.DB").(*gorm.DB)
var users []User
db.Find(&users)
ctx.JSON(users)
})
容易踩的坑:
- 每个请求都新建
*gorm.DB,导致连接池失控 - 没配置 GORM 的
SetMaxOpenConns和SetMaxIdleConns,高并发下 MySQL 报 “Too many connections” - 结构体字段没加
gormtag,GORM 默认按驼峰转下划线,表名对不上
路由分组与控制器风格组织代码
Iris 没强制 MVC,但用 Party 分组 + 独立函数模拟控制器,比全堆在 main.go 更可持续:
api := app.Party("/api")api.Get("/users", userHandler.GetList)api.Post("/users", userHandler.Create)
真正要注意的是依赖传递:handler 函数无法直接访问 app 或 db,得靠 ctx.Values() 或闭包捕获。闭包写法简洁但测试困难;Values() 更正交,但类型断言易错——建议封装一个 DBFromContext(ctx iris.Context) *gorm.DB 工具函数复用。
复杂点在于中间件顺序:比如 JWT 验证中间件必须在路由匹配后、handler 执行前生效,api.Use(authMiddleware) 必须写在 api.Get 之前,否则白加。











