strings.Join/Split
Images := strings.Join(req.Images, ","),
articleTagIDs := strings.Split(articleNew.TagIDs, ",")
注:
tmp := ""
tmparr := strings.Split(tmp, ",")
for _, item := range tmparr {
print("[" + item + "]")
}
//输出[]
注:
//空string split出来成了[""]
if a.Images != "" {
meta.Images = strings.Split(a.Images, ",")
} else {
meta.Images = []string{}
}
返回错误:fmt.Errorf("returnCode %v message %v", res.ReturnCode, res.Message)
c.JSON(http.StatusOK, gin.H{"result": true})
func GetPager(c *gin.Context) (offset int, limit int, err error) {
offset, err = strconv.Atoi(c.Query(consts.OffsetInQuery))
limit, err = strconv.Atoi(c.Query(consts.LimitInQuery))
if offset < 0 {
offset = 0
}
if limit <= 0 {
limit = consts.PageLimit
}
return offset, limit, err
}
必填字段
Mobile string `json:"mobile" binding:"required"`
gin.H
c.JSON(http.StatusOK, response.Ok(gin.H{"items": medals, "total": total}))
不要前端筛数据,10条筛成0条的话,导致不断加载...
在service层里两次到dao层db的列表时,前半段数据只访问一个dao层即可,当需要后面的数据时因为页数要求需要访问两个dao层
### 此方法需要增加可读性 可维护性 每个if要分出来
func (s *articleMysqlStore) GetTagListForUser(req *request.TagListForUserReq) ([]*model.Tag, int, error) {
tags := make([]*model.Tag, 0)
db := s.db.Table("tag")
db = db.Joins("left join plate_tag ON plate_tag.tag_id = tag.id")
if req.PlateID != "" {
db = db.Where("plate_tag.plate_id = ?", commonUtils.IDToSN(req.PlateID))
}
if req.Keyword != "" {
db = db.Where("tag.title like '%" + req.Keyword + "%' or tag.alias like '%" + req.Keyword + "%'")
}
if req.NotIncludePlateID != "" {
db = db.Where("plate_tag.plate_id <> ?", commonUtils.IDToSN(req.NotIncludePlateID))
}
var total int
db.Count(&total)
db = db.Select("*")
if req.SortBy != 0 {
if req.OrderBy == 0 {
db = db.Order("article_count")
} else {
db = db.Order("article_count desc")
}
}
if req.Limit != 0 {
db = db.Limit(req.Limit)
} else {
db = db.Limit(20)
}
if req.Offset != 0 {
db = db.Offset(req.Offset)
}
db = db.Group("tag.id")
err := db.Scan(&tags).Error
if err != nil {
return nil, total, err
}
return tags, total, err
}
当需要拼接其他数据时,为了效率可以先取出全部的数据放到map,然后再在内存中选取:
plateMap := make(map[string]*plate.ResponsePlateMainDataResp, 0)
for _, plateItem := range plates {
plateCurrent := plateItem
plateMap[*plateCurrent.Id] = &plateCurrent
}
map查找、类型断言、通道接收:
v, ok = m[key] // map lookup
v, ok = x.(T) // type assertion
v, ok = <-ch // channel receive
也可以返回一个值:
v = m[key] // map查找,失败时返回零值
v = x.(T) // type断言,失败时panic异常
v = <-ch // 管道接收,失败时返回零值(阻塞不算是失败)
golang的格式化工具:
golang.org/x/tools/cmd/goimports导入工具,它可以根 据需要自动添加或删除导入的包;许多编辑器都可以集成goimports工具,然后在保存文件的 时候自动运行。类似的还有gofmt工具,可以用来格式化Go源文件。
time:
time.After(10 * time.Second) //10秒后
time.NewTicker(time.Minute * 30) //每隔30分钟