iris服务必须显式调用app.listen()或app.run()才能启动,否则实例不监听端口、无日志、浏览器无法访问;go mod初始化和v12依赖拉取缺一不可,路径参数须用ctx.params().get(),中间件响应后必须调ctx.stopexecution()。

iris.New() 创建实例后不调用 app.Listen() 或 app.Run(),服务根本不会启动——终端无报错、浏览器连不上、netstat 查不到监听端口,全是这个原因。
go mod 初始化和依赖拉取必须一步到位
不是“装了 Iris 就能跑”,而是 Go 模块系统必须先就位:
- 在项目根目录执行
go mod init myapp(模块名必须小写、无空格、无下划线) - 立刻跟一句
go get github.com/kataras/iris/v12@latest(漏掉/v12会拉 v11,类型不兼容) - 检查生成的
go.mod文件里是否有github.com/kataras/iris/v12 v12.2.11这类行,没有就重试 - 国内用户务必设代理:
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy,https://proxy.golang.org
路径参数和查询参数别混用
RESTful 路由里的 {id} 是路径段,不是 URL 查询字符串,取值方式完全不同:
-
/user/{id:uint64}→ 用ctx.Params().Get("id")或ctx.Params().GetInt64("id") -
/search?keyword=go&page=2→ 用ctx.URLParam("keyword")和ctx.URLParam("page") - 拼错参数名(比如路由是
{userID}却写ctx.Params().Get("id"))会静默返回空字符串,容易漏掉校验 -
ctx.Params().Get()不 panic,但后续解引用 nil 或类型转换失败会 panic
中间件里写完响应必须调 ctx.StopExecution()
ctx.Next() 只是移交控制权,它不阻止后续代码执行。一旦你已经写了响应(比如 ctx.JSON(401, ...)),再调 ctx.Next() 就会导致业务 handler 也被执行——鉴权失败后仍进数据库查数据,就是这么来的。
- 正确模式:写响应 →
ctx.StopExecution()→ 确保ctx.Next()在 if 分支外不被执行 - 常见错误:JWT 中间件里
ctx.JSON(401, ...)后还写了ctx.Next(),没加return或条件包裹 - Iris 不像 Gin 那样有
abort()自动拦截,这一步必须手动盯住
日志写文件不能只靠 SetOutput()
iris.Logger().SetOutput() 看似简单,但出错常因文件没打开成功就传了 nil:
- 必须用
os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644),且严格检查err - 替换必须在
app.Run()或app.Listen()之前完成,否则日志已绑定os.Stdout - 单靠
os.File追加无法轮转,生产环境必须换zerolog或zap,再通过app.Logger().SetChild()注入 - 别忽略级别控制:
app.Logger().SetLevel(iris.LogInfo),否则 debug 日志刷屏,文件膨胀极快











