说明

 
python有元类概念,在定义db模型时,相当方便,极大简化代码
 
go中没有元类概念, gorm有模型定义,看看它怎么实现,能否借鉴
 

gorm原理

 
1. gorm运用了结构体标签,通过reflect获取标签内容,这是基本原理,这里不做介绍。
 
2. 关注它如何运用这些特性,借鉴使用
 
3. 直接分析源码太复杂,绕的路径太多。基于gorm模型定义最核心的代码,写一个小例子,展示gorm的用法,这也是我需要借鉴的地方
 
4. gorm所有的接口db.Create, db.Model,...最终都是调用schema.Parse
 
 
package main

import (
"fmt"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"reflect"
"sync"
)

type Product struct {
gorm.Model
Code  string
Price uint
}

func main() {
product, _ := schema.Parse(&Product{}, &sync.Map{}, schema.NamingStrategy{})
fmt.Println(product)
fmt.Println(reflect.TypeOf(product))
}

//打印
//main.Product
//*schema.Schema
 

总结

 
1. 自定义的model,最终都被gorm转为Schema类型
 
2. model仅仅提供字段、标签信息
 
3. gorm并且实现了Schema的String() string方法,让打印看起来是Product
 
4. gorm的模型定义,比较encoding/json简单,比较适合借鉴使用