测试连接数据库的时候,遇到的细节坑
var DbEngine *xorm.Engine
func init() {
// mysql, 用户名, 密码, ip, 端口, 数据库名称, 字符集
DbEngine, err := xorm.NewEngine("mysql", "root:111111@(192.168.1.116:3306)/my_go_chat?charset=utf8")
if nil != err {
log.Fatal(err.Error())
}
// 设置显示sql语句
DbEngine.ShowSQL(true)
// 设置数据库最大连接数
DbEngine.SetMaxOpenConns(2)
// 开始同步表结构
err = DbEngine.Sync2(new(User))
if nil != err {
log.Fatal(err.Error())
} else {
fmt.Println("Table `User` has been mounted")
}
}
当调用数据库的时候,遇到报错
func Login(mobile string, pwd string) (User, error) {
temp := User{}
_, err := DbEngine.Where("mobile=?", mobile).Get(&temp)
// 其他操作
...
...
}
报错信息
invalid memory address or nil pointer dereference
调试模式追了好半天,好吧,原来是局部变量和全局变量混了,于是有了下边的测试代码
var TestVar string
func main() {
// **** TestVar 这样就变成了一个函数内的局部变量,并不是全局变量TestVar ****
//TestVar, err := test("glq")
// 这样就是两个变量都使用已定义的变量,所有可以为全局变量TestVar赋值
var err error
TestVar, err = test("zxj")
if nil != err {
fmt.Println("err = ", err.Error())
}
fmt.Println("TestVar = ", TestVar)
// 打印全局变量
print_var()
}
func print_var() {
fmt.Println("TestVar = ", TestVar)
}
func test(in string) (string, error) {
return strings.ToUpper(in), nil
}