前言
-
问题:
项目遇到服务正常启动着,但是无法正常对外提供接口访问;nginx转发正常,但是较慢,nginx记录http状态码为200。 -
背景:
项目框架:Golang Gin框架
一、日志排查
通过无法对外提供正常服务时的日志排查发现一个问题:Go程序在大量的抛panic异常日志【定时任务出问题导致】,go协程阻塞,导致程序出现假死状态,无法对外正常服务。
通过追踪堆栈信息发现:是一个nil空指针异常问题,问题在于:
参数是*gin.Context
,函数接收的是context.Context
类型,并在函数里判断了:
func Foo(){
var ctx *gin.Context
// 此时ctx为nil
XXTest(ctx, 1)
}
func XXTest(ctx context.Context, lvl int) bool {
// 其他逻辑
if ctx == nil {
return false
}
// 接下来的其他逻辑
}
此时问题就来了,在XXTest()
中,ctx并不是nil,因为对于interface类型的值来说,分为类型和值,只有类型和值都为nil,才是nil,ctx的类型是*gin.Context,所以不等于nil,判断进不去导致执行了接下来的逻辑,从而引发了panic