go 的一次内存地址引用bug
代码如下
func (c *Applet) GetByAppid(appid string) error {
var data Applet // not use *Applet
sql := fmt.Sprintf("select %s from applet where appid = ?", gt.GetColSQL(Applet{}))
cd := crud.Params(gt.Data(&data)).Select(sql, appid).Single()
if err := cd.Error(); err != nil {
//log.Log.Error(err.Error())
return err
}
c = &data
return nil
}
-
来看上面函数作用
1.通过appid获得Applet完整数据 -
运行测试
func TestExtends(t *testing.T) {
var (
wx Applet
)
_ = u.ShouldBindJSON(&wx)
if err := wx.GetByAppid(wx.Appid); err != nil {
u.JSON(http.StatusOK, result.GetError(err.Error()))
return
}
t.Log(wx)
}
// output
空值对象
PASS
-
来看为什么会这样
GetByAppid()
内部定义变量var data Applet
, 虽然查询出值, 并通过c = &data
, 但是这只是地址上引用的赋值, data变量申请的内存空间, 在函数结束后便释放了 -
最终修复如下:
func (c *Applet) GetByAppid(appid string) error { //var data Applet // not use *Applet sql := fmt.Sprintf("select %s from applet where appid = ?", gt.GetColSQL(Applet{})) cd := crud.Params(gt.Data(&c)).Select(sql, appid).Single() if err := cd.Error(); err != nil { //log.Log.Error(err.Error()) return err } //c = &data return nil }