Skip to content

GoFrame避坑指南和实践干货(2)

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河~

前段时间有整理一篇# GoFrame避坑指南和实践干货,这篇算是续集吧。

Redis Setex

首先我们要知道这个概念:Redis Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。

在goframe中是支持这么操作的:

go
_, err = g.Redis().Do("SETEX", redisKey, 86400, res)

rune的使用

首先我们要知道rune是int32的别名:

go
type rune = int32

golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。

len([]rune("王中阳"))的长度,一个中文返回一个长度,而不是返回3个字符长度。

gvalid数据校验

在goframe中,我们可以在结构体中设置校验规则,不需要在业务逻辑中进行判断,这样能使我们的代码更清晰。

示例

go
//校验地址 if err := gvalid.CheckStruct(ctx, data.Address, nil); err != nil {    response.ParamErr(r, err) }

其中:data.Address 是需要校验的数据。在执行校验地址之前已经把传入的数据赋值到了对应的结构体:

go
var data *define.OrderServiceCreateReq if err := r.Parse(&data); err != nil {    response.ParamErr(r, err) }

其中:define.OrderServiceCreateReq 的定义如下:

go

```type OrderServiceCreateReq struct {    SellerId       uint                    `json:"sellerId"`    AppId          int                     `json:"appId"`    ChannelId      int                     `json:"channel_id"`    OrderSn        string                  `p:"orderSn" v:"orderSn@required#orderSn 必须传递"`    Spu            []*OrderServiceSkuReq   `p:"spu" v:"spu@required#请输入spu"`    Address        *OrderServiceAddressReq `p:"address" v:"address@required#请输入address"`    StrictMode     bool                    `json:"strictMode"`    PayType        int                     `p:"payType