golang中指针指向错误或不存在?

在做一个Gin、Gorm的项目时,将Service、Model、db分开存放后进行调用发现会出现指针错误的问题,下面是我的部分代码。

  1. 数据库连接 db -> mysql.go

    package db
    var Mysql *gorm.DB
    func init() {
     // dsn连接格式  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
     dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",
         config.MYSQL_USER,
         config.MYSQL_PWD,
         config.MYSQL_HOST,
         config.MYSQL_PORT,
         config.MYSQL_DB,
         config.MYSQL_TIMEOUT)
     var err error
     Mysql, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
     if err != nil {
         panic("connect datebase faild, error:" + err.Error())
     }
    }
    
  2. model -> user.go

    package model
    type User struct {
     // Id       int    `gorm:"primary_key"`
     gorm.Model
     Username string `gorm:"not null"`
     Password string `gorm:"not null"`
    }
  3. service -> user.go

    package service
    type UserService struct{}
    func (s *UserService) CreateUser(user *model.User) error {
     return db.Mysql.Create(user).Error
    }
  4. 调用逻辑

    package v1
    func Register(c *gin.Context) {
     userService := &service.UserService{}
     var user model.User
     user.Password = "123456"
     user.Username = "Ustinian"
     userService.CreateUser(&user)
     fmt.Println("用户注册")
    }
  5. 报错信息
    image.png

5.17日更新(已解决)
dsn参数设置不对,timeout缺少单位。
参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name
image.png

阅读 1.8k
1 个回答
func init()

隐式 init 没有调用, var Mysql *gorm.DB 是空指针

推荐改为 func Init() 然后初始化显式调用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题