- 首先,在golang里面所有函数的传参都是传副本
- 我的错误在于认为切片是属于引用类型的就不用传指针进去了,结果事实证明,不管是不是引用类型,都需要传指针才能改变原值
// Contact 通讯录 *********// db/contact.go
type Contact struct {
gorm.Model
Usr int `json:"usr"` // 归属人id
Typ int `gorm:"default:1" json:"type"` // 类型 1 单人 2 群聊
Remark string `json:"remark"` // 备注
TargetID int `json:"target_id"` // 好友id
AddTyp int `json:"add_typ"` // 添加类型 1 扫码 2 手机通讯录 3 搜索添加 4 附近的人
Important int `gorm:"default:0" json:"important"` // 星标 1 是 0 否
Status int `gorm:"default:0" json:"status"` // 0 添加未同意 1 添加已同意 2 已拉黑
}
// GetContacts 获取用户联系人列表 *******// service/contactlogi.go
func GetContacts(c *gin.Context) {
meMobile := c.GetString("usrname") // 此处是手机号:从token中解析出来
// 1. 验证获取登录用户ID
// 2. 根据本用户ID 获取对应的联系人列表
// 3. 本列表移动端应缓存起来
var me appuser.User
me.Mobile = meMobile
if err := me.CheckUser(&me); err == nil {
var con contat.Contact
var res []*contat.Contactlist
if err := con.GetListByid(&res, int(me.ID)); err == nil { // here
response.ReturnJSON(c, http.StatusOK, statuscode.Suucess.Code, statuscode.Suucess.Msg, res)
} else {
response.ReturnJSON(c, http.StatusOK, statuscode.Faillure.Code, statuscode.Faillure.Msg, nil)
}
} else {
response.ReturnJSON(c, http.StatusOK, statuscode.UserNotExit.Code, statuscode.UserNotExit.Msg, meMobile)
}
}
下面是 db/contact.go
// GetListByid 通过登录用户ID获取列表
func (c *Contact) GetListByid(res *[]*Contactlist, target int) error {
return appmysql.DB.Table("contacts").Select("contacts.usr,contacts.important,contacts.add_typ,users.nick_name,users.icon,users.desc,users.gender,users.mobile").Joins("left join users on users.id = contacts.target_id").Where("contacts.usr = ?", target).Scan(&res).Error
}
总结
- 在使用gorm的过程中, 获取值都需要使用指针变量; 接收者方法,接收者也 建议是指针
有疑问加站长微信联系(非本文作者)