

### validator

[GitHub地址](github.com/go-playground/validator)

包验证器，可以用于验证参数是否符合规则，比如下方的比较验证，还有其他可以查看网址的详细介绍
go-zero自带的有校验器，可以使用

| Tag  | Description           |
| ---- | --------------------- |
| eq   | Equals                |
| gt   | Greater than          |
| gte  | Greater than or equal |
| lt   | Less Than             |
| lte  | Less Than or Equal    |
| ne   | Not Equal             |



### goverter

[GitHub地址](https://github.com/jmattheis/goverter)

类型转换器，可以用于类型的转换，比如下面的代码

```go
func (l *CreatePopupLogic) CreatePopup(in *backgroundrpcmodel.ResPopup) (*backgroundrpcmodel.ResResult, error) {
    _, err := l.svcCtx.PopupModel.Insert(l.ctx, u.Convert.SysPopupR2S(in.Info))
    if err != nil {
       return nil, rerr.NewFromSQL(err)
    }
    return &backgroundrpcmodel.ResResult{
       Result: true,
    }, nil
}
```

使用

```
goverter gen .
```



### asynq

[GitHub网址](https://github.com/hibiken/asynq)

- 入队流程

  ```go
  payload := &jobtype.xxxPayload{}
  payloadByte, err := jsoniter.Marshal(payload)
  if err != nil {
  	logt.Error("xxx jsoniter.Marshal err:", err)
  	return nil, zerr.New(rescode.DataFormatConversionError)
  }
  	_, err = l.svcCtx.AsynqClient.Enqueue(asynq.NewTask(jobtype.xxx, payloadBytes, asynq.Queue(consts.QueueLow)))
  if err != nil {
  	logt.Error("xxx enqueue err:", err)
  	return nil, zerr.New(rescode.EnqueueErr)
  }
  ```

- 自行定义了队列优先级，在入队的时候可以加参数进行选择

  ```
  consts.QueueCritical: 6,
  consts.QueueDefault:  3,
  consts.QueueLow:      1,
  ```

- 处理前流程（反序列化,获取数据）

  ```go
  var payload jobtype.xxx
  err := json.Unmarshal(task.Payload(), &payload)
  if err != nil {
      logt.Error("xxx unmarshal payload err:", err)
      return zerr.New(rescode.DataFormatConversionError)
  }
  ```



### gorm

[官网文档](https://gorm.io/zh_CN/docs/)

**使用gorm + sqlx，但是复用sql连接**

```go
func NewServiceContext(c config.Config) *ServiceContext {
    logx.Infof("Cache config: %+v", c.CacheRedis)

    gormDB, err := gorm.Open(postgres.Open(c.Database.DataSource), &gorm.Config{})
    if err != nil {
       msg := fmt.Sprintf("连接数据库失败 %s ", err.Error())
       logx.Error(msg)
       panic(msg)
    }
    sqlDB, err := gormDB.DB()
    if err != nil {
       msg := fmt.Sprintf("获取底层连接失败: %s", err.Error())
       logx.Error(msg)
       panic(msg)
    }
    sqlxConn := sqlx.NewSqlConnFromDB(sqlDB)
    return &ServiceContext{
       Config:        c,
       UserAuthModel: models.NewUserAuthModel(sqlxConn, c.CacheRedis, gormDB),
    }
}
```

