【Go】反射在Beego/Orm中的应用
应用
在Beego Orm中,作者使用了go的反射机制,实现 1、通过数据模型建立数据表
type DataSheet struct { Name string
orm:"NOT NULL" json:"name"
//表名称 Type stringorm:"NOT NULL" json:"type"
//周期类型 日/月/季/年 Way stringorm:"NOT NULL" json:"way"
//生成方式 Time stringorm:"NOT NULL" json:"time"
//创建时间 Creator stringorm:"NOT NULL" json:"creator"
//制作人 }
在调用 orm.RegisterModel(new(DataSheet)) 后会自动生成名为 data_sheet 的数据表
2、通过模型中的tag
> orm:"auto;pk"
> orm:"rel(m2m)"
自动设置字段属性和表之间关系
完整代码
package main
import (
"errors"
"fmt"
"reflect"
)
type DataSheet struct {
Name string `orm:"NOT NULL" json:"name"` //表名称
Type string `orm:"NOT NULL" json:"type"` //周期类型 日/月/季/年
Way string `orm:"NOT NULL" json:"way"` //生成方式
Time string `orm:"NOT NULL" json:"time"` //创建时间
Creator string `orm:"NOT NULL" json:"creator"` //制作人
}
func main() {
fmt.Println("=================================")
sql, _ := registerModel(&DataSheet{
Name: "模板名",
Type: "周期类型",
Way: "生成方式",
Time: "2017-01-01 00:00:00"})
fmt.Println(sql)
}
//根据数据结构模型自动生成sql查询语句
func registerModel(models interface{}) (string, error) {
valModels := reflect.ValueOf(models) //获取models内的值得指针位置
indModels := reflect.Indirect(valModels)
//检查传入类型,必须为指针类型
if valModels.Kind() != reflect.Ptr {
return "", errors.New("Invalid input models")
}
//输出数据模型名
name := reflect.TypeOf(models).Name()
fmt.Println("结构体名:", name)
if indModels.NumField() == 0 {
return "", errors.New("No valid fields")
}
//输出变量名 与 对应值
for i := 0; i < indModels.NumField(); i++ {
//获取字段
k := indModels.Type().Field(i)
fmt.Println("字段名:", k.Name, " 字段类型:", k.Type, " 字段标识:", k.Tag)
//获取内容
c := indModels.Field(i)
if c.Kind() != reflect.Invalid {
fmt.Println("内容:", c.String())
}
//fmt.Println("类型", c.Kind())
}
return name, nil
}
输出结果
================================= 结构体名: 字段名: Name 字段类型: string 字段标识: orm:“NOT NULL” json:“name” 内容: 模板名 字段名: Type 字段类型: string 字段标识: orm:“NOT NULL” json:“type” 内容: 周期类型 字段名: Way 字段类型: string 字段标识: orm:“NOT NULL” json:“way” 内容: 生成方式 字段名: Time 字段类型: string 字段标识: orm:“NOT NULL” json:“time” 内容: 2017-01-01 00:00:00 字段名: Creator 字段类型: string 字段标识: orm:“NOT NULL” json:“creator” 内容: