记录golang常见panic及处理。
panic: runtime error: invalid memory address or nil pointer dereference
产生原因
1 | var db *gorm.DB |
报这个错的原因是GoLang初始化指针的时候会为指针db
的值赋为nil
,表示系统还并没有给db
分配地址,这时用db
进行操作即会报上述错误。
解决方法
指针相关的操作确保初始化后在使用
Key “github.com/gin-contrib/sessions” does not exist
解决办法
1 | import ( |
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 | import "encoding/gob" |
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。