golang 常见panic处理

记录golang常见panic及处理。

panic: runtime error: invalid memory address or nil pointer dereference

产生原因

1
2
3
4
5
6
7
var db *gorm.DB
var err error

type User {...}
// db, err = gorm.Open(settings.DatabaseSetting.Engine, dsn)
u := User{...}
db.Create(&u)

报这个错的原因是GoLang初始化指针的时候会为指针db的值赋为nil ,表示系统还并没有给db分配地址,这时用db进行操作即会报上述错误。

解决方法

指针相关的操作确保初始化后在使用

Key “github.com/gin-contrib/sessions” does not exist

解决办法

1
2
3
4
5
6
7
8
9
10
11
import (
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
)

r := gin.Default()

// Registration session
store := cookie.NewStore([]byte(configs.SecretKey)) // secret
r.Use(sessions.Sessions("sessionid", store))

gob: type not registered for interface

1
error, securecookie: error - caused by: securecookie: error - caused by: gob: type not registered for interface: models.UsersUser[GIN] 2021/02/25- 17:52:36

解决方法

1
2
3
4
5
6
7
8
import "encoding/gob"
import "github.com/gin-contrib/sessions"

gob.Register(userModels.UsersUser{})

session := sessions.Default(c)
sessionId := configs.SessionKey
session.Set(sessionId, user)

fatal error: concurrent map read and map write

并发的 map 读和 map 写,也就是说使用了两个并发函数不断地对 map 进行读和写而发生了竞态问题,map 内部会对这种并发操作进行检查并提前发现。

需要并发读写时,一般的做法是加锁,但这样性能并不高,Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map,sync.Map 和 map 不同,不是以语言原生形态提供,而是在 sync 包下的特殊结构。

sync.Map 有以下特性:

  • 无须初始化,直接声明即可。
  • sync.Map 不能使用 map 的方式进行取值和设置等操作,而是使用 sync.Map 的方法进行调用,Store 表示存储,Load 表示获取,Delete 表示删除。
  • 使用 Range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值,Range 参数中回调函数的返回值在需要继续迭代遍历时,返回 true,终止迭代遍历时,返回 false。

panic: runtime error: slice bounds out of range [:-1]

-------------本文结束感谢您的阅读-------------