关于var赋值的疑问

  • 两代码之中仅使用了大小写不同的变量,其余代码相同,但是大些的会报错,小写的执行正常,这是怎么回事呢?

    出错代码:

    package main
    import (
      "fmt"
      "github.com/gin-gonic/gin"
      "gorm.io/driver/mysql"
      "gorm.io/gorm"
    )
    var DB *gorm.DB        // 区别
    var err error
    type Person struct {
      ID   uint   `json:"id`
      Name string `json:"name"`
      Pass string `json:"pass"`
    }
    func main() {
      DSN := "root:passwd@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
      DB, err := gorm.Open(mysql.Open(DSN), &gorm.Config{})        // 区别
      if err != nil {
          fmt.Println(err)
      }
      DB.AutoMigrate(&Person{})        // 区别
      r := gin.Default()
      r.GET("/", GetProjects)
      r.Run(":80")
    }
    func GetProjects(c *gin.Context) {
      var people []Person
      if err := DB.Find(&people).Error; err != nil {        // 区别
          c.AbortWithStatus(404)
          fmt.Println(err)
      } else {
          c.JSON(200, people)
      }
    }
    // 出错

正常代码:

package main
import (
    "fmt"
    "github.com/gin-gonic/gin"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)
var db *gorm.DB        // 区别
var err error
type Person struct {
    ID   uint   `json:"id`
    Name string `json:"name"`
    Pass string `json:"pass"`
}
func main() {
    DSN := "root:passwd@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
    db, err = gorm.Open(mysql.Open(DSN), &gorm.Config{})        // 区别
    if err != nil {
        fmt.Println(err)
    }
    db.AutoMigrate(&Person{})        // 区别
    r := gin.Default()
    r.GET("/", GetProjects)
    r.Run(":80")
}

func GetProjects(c *gin.Context) {
    var people []Person
    if err := db.Find(&people).Error; err != nil {        // 区别
        c.AbortWithStatus(404)
        fmt.Println(err)
    } else {
        c.JSON(200, people)
    }
}
// 正确

完整报错

关于var赋值的疑问

giao哥
最佳答案
  DB, err := gorm.Open(mysql.Open(DSN), &gorm.Config{}) 去掉 " :  " 

建议参考下图

var DB *gorm.DB

// MysqlInit 初始化数据库
func init() {
    c := config.Conf.DB
    dsn := fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", c.Name, c.Pass, c.Host, c.Port, c.DB)

    logger := gormDefaultLogger.Default.LogMode(gormDefaultLogger.Info)
    if config.Conf.System.Env == "prod" {
        logger = gormDefaultLogger.Default.LogMode(gormDefaultLogger.Error)
    }

    gormDB, err := gorm.Open(mysql.New(mysql.Config{
        DSN:                       dsn,   // DSN data source name
        DefaultStringSize:         255,   // string 类型字段的默认长度
        DisableDatetimePrecision:  true,  // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
        DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
        DontSupportRenameColumn:   true,  // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
        SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
    }), &gorm.Config{
        Logger:                 logger,
        SkipDefaultTransaction: true,
    })
    if err != nil {
        log.Fatal(err)
    }
    db, err := gormDB.DB()
    if err != nil {
        log.Fatal(err)
    }
    db.SetMaxIdleConns(10)           // 设置空闲的最大连接数
    db.SetMaxOpenConns(40)           // 设置与数据库的最大打开连接数
    db.SetConnMaxLifetime(time.Hour) // 设置可以重用连接的最长时间
    DB = gormDB
}
1年前 评论
讨论数量: 4

把报错贴出来看看

1年前 评论
deatil (作者) 1年前
Scrooge (楼主) 1年前
giao哥
  DB, err := gorm.Open(mysql.Open(DSN), &gorm.Config{}) 去掉 " :  " 

建议参考下图

var DB *gorm.DB

// MysqlInit 初始化数据库
func init() {
    c := config.Conf.DB
    dsn := fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", c.Name, c.Pass, c.Host, c.Port, c.DB)

    logger := gormDefaultLogger.Default.LogMode(gormDefaultLogger.Info)
    if config.Conf.System.Env == "prod" {
        logger = gormDefaultLogger.Default.LogMode(gormDefaultLogger.Error)
    }

    gormDB, err := gorm.Open(mysql.New(mysql.Config{
        DSN:                       dsn,   // DSN data source name
        DefaultStringSize:         255,   // string 类型字段的默认长度
        DisableDatetimePrecision:  true,  // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
        DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
        DontSupportRenameColumn:   true,  // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
        SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
    }), &gorm.Config{
        Logger:                 logger,
        SkipDefaultTransaction: true,
    })
    if err != nil {
        log.Fatal(err)
    }
    db, err := gormDB.DB()
    if err != nil {
        log.Fatal(err)
    }
    db.SetMaxIdleConns(10)           // 设置空闲的最大连接数
    db.SetMaxOpenConns(40)           // 设置与数据库的最大打开连接数
    db.SetConnMaxLifetime(time.Hour) // 设置可以重用连接的最长时间
    DB = gormDB
}
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!