这是一篇记录实际应用中遇到的变量作用域问题,golang的学习资料中很多都提到过这个知识点,但是实际使用中还是不小心就忽略掉坑里了。
背景:打算封装一个gorm的初始化连接db的操作放在一个包里,通过调用这个初始化函数为包里面的全局变量var DB *gorm.DB
赋值来作为操作db的句柄
错误写法:
var DB *gorm.DB func InitGormDB(engine, addr, name, username, password string) { var dsn string switch strings.ToLower(engine) { case "mysql": dsn = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", username, password, addr, name) case "postgres": addr_ := strings.Split(addr, ":") dsn = fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s", addr_[0], addr_[1], username, name, password) case "sqlite3": dsn = name case "mssql": dsn = fmt.Sprintf("sqlserver://%s:%s@%s?database=%s", username, password, addr, name) } // be careful the var scope // use `:=` will declare a new local variable named DB, raise compile error of var declared and not used DB, err := gorm.Open(engine, dsn) if err != nil { log.Fatal(err) } }
在 DB, err := gorm.Open(engine, dsn)
这一句使用的是 :=
短变量声明语句,新声明了一个DB
和err
局部变量,
golang中全局变量与局部变量名称可以相同,局部的DB
会屏蔽全部的DB
, 局部DB
的赋值不代表全局的DB
被赋值,他们是两个变量。
由于后面的代码没有使用这个局部的DB
变量,所以编译时会报错DB declared and not used
所以要解决这个问题只需不要再声明新的局部变量即可,直接使用=
进行赋值操作,修改如下:
var DB *gorm.DB func InitGormDB(engine, addr, name, username, password string) { var dsn string var err error switch strings.ToLower(engine) { case "mysql": dsn = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", username, password, addr, name) case "postgres": addr_ := strings.Split(addr, ":") dsn = fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s", addr_[0], addr_[1], username, name, password) case "sqlite3": dsn = name case "mssql": dsn = fmt.Sprintf("sqlserver://%s:%s@%s?database=%s", username, password, addr, name) } // var scope: use `:=` will declare a new local variable named DB, raise compile error of var not be used DB, err = gorm.Open(engine, dsn) if err != nil { log.Fatal(err) } }
网友185.*.*.3[火星]2022-06-30 05:37
网友54.*.*.91[法国]2022-06-30 05:32
网友216.*.*.226[Seattle]2022-06-30 05:25
网友157.*.*.79[Redmond]2022-06-30 05:08
发表评论
亲~ 评论内容是必须的哟! o(∩_∩)o
昵称
邮箱
主页
评论