当在一个函数执行过程中调用panic()函数时,正常的函数执行流程将立即终止,但函数中 之前使用defer关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致 逐层向上执行panic流程,直至所属的goroutine中所有正在执行的函数被终止。
例:
defer func() {
if r := recover(); r != nil {
log.Printf("Runtime error caught: %v", r)
}
}()
getPlateLevelInfo := func(plateSN int64, userID int, commentDataResp *response.CommentDataResp) {
if plateSN != 0 {
plateDetail, _ := GetPlateDetail(plateSN, strconv.Itoa(userID))
if plateDetail != nil {
if *plateDetail.IsFollow == 1 {
levelInfo := &model.PlateLevelInfo{
Level: int(*plateDetail.LevelInfo.Level),
LevelName: *plateDetail.LevelInfo.LevelName,
Experience: int(*plateDetail.LevelInfo.Experience),
UpgradeExperience: int(*plateDetail.LevelInfo.UpgradeExperience),
LevelIcon: *plateDetail.LevelInfo.LevelIcon,
FullLevel: *plateDetail.LevelInfo.FullLevel,
}
commentDataResp.PlateLevelInfo = levelInfo
}
}
}
}
-------------------------------
defer func() {
if r := recover(); r != nil {
log.Printf("Runtime error caught: %v", r)
}
}() //紧在foo函数的上方使用
foo()