==问题描述==
如下代码,验证golang的xorm基本用法,
在init中加载了xorm的engine,并赋值给全局变量xe,结果在main中报空指针,提示xe为nil
package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/xorm" ) type PointInfo struct { Id int64 `xorm:"pk autoincr"` ProductKey string `xorm:"product_key"` DeviceName string `xorm:"device_name"` PointId string `xorm:"point_id"` } const ( UserName = "root" PassWord = "RexelMySql998866" Host = "47.116.50.192" Port = "33306" Database = "pulse" Charset = "utf8" ) var xe *xorm.Engine func init() { sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", UserName, PassWord, Host, Port, Database, Charset) // 1、创建数据库引擎 xe, err := xorm.NewEngine("mysql", sqlStr) if err != nil { fmt.Println("数据库连接失败:", err) return } if xe == nil { fmt.Println("引擎初始化异常") return } // 2、创建或者同步表(名称为Stu) err = xe.Sync(new(PointInfo)) if err != nil { fmt.Println("数据表同步失败:", err) } } func main() { id := insert() query(id) update(id) deleteOne(id) } func insert() (id int64) { pointInfo := new(PointInfo) pointInfo.ProductKey = "product1" pointInfo.DeviceName = "device1" pointInfo.PointId = "point1" affected, err := xe.Insert(pointInfo) if err != nil { return affected } fmt.Println(affected) return pointInfo.Id } func query(id int64) { pointInfo := PointInfo{Id: id} get, err := xe.Get(&pointInfo) if err != nil { return } fmt.Println(get) } func update(id int64) { pointInfo := new(PointInfo) pointInfo.ProductKey = "product2" pointInfo.DeviceName = "device2" pointInfo.PointId = "point2" affected, err := xe.Id(id).Update(pointInfo) if err != nil { return } fmt.Println(affected) } func deleteOne(id int64) { pointInfo := new(PointInfo) affected, err := xe.Id(id).Delete(pointInfo) if err != nil { return } fmt.Println(affected) }
==原因分析==
xe变量在init中的是用:=生成的,所以xe是局部变量