Go实战全家桶之三十六: go动态创建结构体

Go实战全家桶之三十六: go动态创建结构体_第1张图片

开源:water/goweb

func (self *PagedbRequest) CreateDbTableStru(meta *metadata.MetadataTable) reflect.Value {

    var metaColService = service.NewMetadataFactroy()
    dbFields := []reflect.StructField{}

    for _, col := range meta.Columns {

       var colType = metaColService.FindGoType(col.DataType)
       var ColTyp8 = reflect.TypeOf(int8(0))

       var ct = func(colType string) *reflect.Type {
          var ColTyp = reflect.TypeOf(int8(0))
          switch colType {
          case "float32":
             ColTyp = reflect.TypeOf(float32(0))
          case "float64":
             ColTyp = reflect.TypeOf(float64(0))
          case "int64":
             ColTyp = reflect.TypeOf(int64(0))
          case "int32":
             ColTyp = reflect.TypeOf(int32(0))
          case "int16":
             ColTyp = reflect.TypeOf(int16(0))
          case "string":
             ColTyp = reflect.TypeOf("")
          case "bool":
             ColTyp = reflect.TypeOf(true)
          case "byte":
             ColTyp = reflect.TypeOf(byte(0))
          case "[]byte":
             ColTyp = reflect.TypeOf([]byte{})

          case "time.Time":
             ColTyp = reflect.TypeOf(time.Now())
             if col.ColumnName == "deleted_at" {
                var t *time.Time
                ColTyp = reflect.TypeOf(t)

             }

          }
          return &ColTyp
       }(colType)
       if ColTyp8 != *ct {
          var colField = reflect.StructField{
             Name: stringutils.Case2Camel(col.ColumnName),
             Type: *ct,
             Tag:  reflect.StructTag(fmt.Sprintf("json:\"%s\"", col.ColumnName)),
          }
          if self.IfExistField(col.ColumnName) {

             dbFields = append(dbFields, colField)
          }
       }
    }

    dbtableType := reflect.StructOf(dbFields)
    dbentity := reflect.New(dbtableType).Elem()
    return dbentity
}

使用
func (self *PagedbRequest) GeneralTakeTable() *page.PageResult {
    var metadataFactroy = service.NewMetadataFactroy()
    var metadata = metadataFactroy.FindMetadata(self.TableName)
    if !metadata.TableExist {
       return page.ResultFailedPageResultErr(errors.New("table not exist"))
    }
    var dbentity = self.CreateDbTableStru(metadata)

    return self.PageRequest.TakeTable(self.TableName, dbentity.Addr().Interface())
}
func (self *PagedbRequest) GeneralScanTable() *page.PageResult {

    var metadata = self.metadataFactroy.FindMetadata(self.TableName)
    if !metadata.TableExist {
       return page.ResultFailedPageResultErr(errors.New("table not exist"))
    }
    var dbentity = self.CreateDbTableStru(metadata)
    var records, err = self.ScanTable(dbentity.Addr().Interface())

    if err != nil {
       return page.ResultFailedPageResultErr(err)
    }

    var result = page.DefaultResult()

    result.PageCurrent = self.PageCurrent
    result.PageSize = self.PageSize
    result.Total, _ = self.CountTable(self.TableName)
    result.Data = records
    return result

}

测试用例

func Test013_GeneralScanTable(t *testing.T) {

    var dbRequest = Default().SetPageSize(3)

    dbRequest.TableName = "service_api_list"
    dbRequest.FieldsName = "id,name,deleted_at" //dbRequest.SetQueryAll(true)
    var result = dbRequest.GeneralScanTable()
    golog.Info(result)

}

结果

.com/leijmdas/gobase/goconfig/common/golog.Info() {
     "code": 200,
     "msg": "成功",
     "page_size": 3,
     "current": 1,
     "total": 6,
     "data": [
          {
               "deleted_at": null,
               "name": "",
               "id": 2
          },
          {
               "id": 3,
               "deleted_at": null,
               "name": ""
          },
          {
               "deleted_at": null,
               "name": "",
               "id": 4
          }
     ],
     "data_agg": null,
     "data_highlight": null,
     "hosturl": ""

你可能感兴趣的:(go,go实战全家桶,golang,开发语言,后端)