Golang公共代码库 - GOModels正式发布在Github
Golang公共代码库 - GOModels正式发布在Github 我在GitHub上创建了一个新仓库NlaakStudios/GoModels。目前我还是Go语言的初学者。虽然很热爱这门语言,但缺乏高级技能来独立完善这个项目。因此,如果您愿意作为贡献者加入我们,或想将您的模型添加到不断增长的模型库中,我们非常欢迎您的参与。
这个项目的核心目标是避免重复造轮子,为Go应用程序提供开箱即用的模型支持,包括dGraph、Badger、JSON、文件系统集成和可视化功能。
如果您有兴趣,可以在GitHub上查看该项目,或通过Telegram上的Nlaak Studios联系我。本项目采用MIT许可证,专为Go开发者社区打造。
更多关于Golang公共代码库 - GOModels正式发布在Github的实战教程也可以访问 https://www.itying.com/category-94-b0.html
安德鲁,为什么所有类型名称末尾都带有"Struct"(比如AddressStruct、CoinStruct等),而不是直接使用Address、Coin这样的命名?我特别查看了AddressStruct,对其运作方式有些困惑:所有字段都是私有的,而且没有相关函数,所以我不确定该如何使用它。
你还提到不要重复造轮子,但我发现你定义了一个DateStruct来记录人员的出生日期,而不是使用time.Time类型。
我并非有意挑剔,只是目前还没理解这样设计的应用场景。
更多关于Golang公共代码库 - GOModels正式发布在Github的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
不,你并不是在吹毛求疵。我正在寻求建议和合作。
首先,为什么它们都以"struct"结尾?如果你查看我昨晚的更新,你会发现结构体包含实际的字段。它们是原始数据,没有接口。所以AddressStruct包含的是字段。而Address本身既包含AddressStruct,也包含所有接口。
我这样做是因为如果你不想要Badger和File接口,你可以构建自己的Address。我正在使用构建模块。
请看这个代码片段:
// UserAuthStruct 包含用于身份验证的用户核心账户数据
type UserAuthStruct struct {
//Username 是此用户的唯一公开名称
Username string
//Email 是用户的电子邮件
Email email.EmailStruct
//Password 是用户密码
Password string /* hash */
//Remember 保持用户登录状态
Remember bool
//Status 跟踪身份验证状态。参见常量 UserStatus???
Status uint
//Created 是账户创建时间
Created time.Time
//LastAuth 是用户上次身份验证的时间
LastAuth time.Time
//LastSeen 是上次检测到用户活动的时间
LastSeen time.Time
//Devices 是设备ID的白名单
Devices []string
//IPAddrs 是IP地址的白名单
IPAddrs []string
}
//UserAuthInterface 强制执行核心方法的定义
type UserAuthInterface interface {
Login()
Logout()
Register()
SendVerificationEmail()
ReceivedVerification()
TestPassword()
}
//UserAuth 完整的UserAuth - 结构和接口
type UserAuth struct {
*UserAuthStruct
UserAuthInterface
intf.DGraphInterface
intf.BadgerInterface
intf.FileInterface
intf.JSONInterface
intf.ViewInterface
}
很明显,我是在边做边设计,边计划边实施。
查看UserAuth.go文件,你会了解我的设计方向。
关于DateStruct…我还在学习GO语言,可能遗漏了某些内容。但基本上,我希望Date能够作为一个独立的节点,这样你或许可以找到具有相同年份或月份的所有人,或者如果你要搞促销活动,可以找到特定年份和月份的人。只是试图保持灵活但简单。
没有什么是一成不变的。我甚至不会称它为Alpha版本。还有很长的路要走,还有很多需要学习的地方。
很高兴看到你在GitHub上发布了GOModels项目!作为一个专注于Go语言模型库的开源项目,这确实能为社区带来很大价值。以下是我对这个项目的一些技术分析和建议实现方式:
项目架构建议
对于模型库来说,建议采用接口驱动的设计模式:
// 定义基础模型接口
type Model interface {
Validate() error
BeforeSave() error
AfterSave() error
GetID() string
SetID(string)
}
// 基础模型结构体
type BaseModel struct {
ID string `json:"id" dgraph:"uid"`
CreatedAt time.Time `json:"created_at" dgraph:"created_at"`
UpdatedAt time.Time `json:"updated_at" dgraph:"updated_at"`
}
func (b *BaseModel) GetID() string {
return b.ID
}
func (b *BaseModel) SetID(id string) {
b.ID = id
}
数据库集成示例
DGraph 集成
type DGraphModel struct {
BaseModel
Name string `json:"name" dgraph:"name"`
Email string `json:"email" dgraph:"email"`
Tags []string `json:"tags" dgraph:"tags"`
}
func (m *DGraphModel) ToMutation() *dgoapi.Mutation {
return &dgoapi.Mutation{
SetJson: m.ToJSON(),
}
}
BadgerDB 集成
type BadgerModel struct {
BaseModel
Data []byte `json:"data"`
}
func (m *BadgerModel) SaveToBadger(db *badger.DB) error {
return db.Update(func(txn *badger.Txn) error {
return txn.Set([]byte(m.ID), m.Data)
})
}
JSON序列化增强
type JSONModel struct {
BaseModel
Metadata map[string]interface{} `json:"metadata"`
}
func (j *JSONModel) ToJSON() []byte {
data, _ := json.Marshal(j)
return data
}
func (j *JSONModel) FromJSON(data []byte) error {
return json.Unmarshal(data, j)
}
文件系统支持
type FileModel struct {
BaseModel
FilePath string `json:"file_path"`
Content []byte `json:"content"`
}
func (f *FileModel) SaveToFile() error {
return os.WriteFile(f.FilePath, f.Content, 0644)
}
func (f *FileModel) LoadFromFile() error {
data, err := os.ReadFile(f.FilePath)
if err != nil {
return err
}
f.Content = data
return nil
}
验证框架
type Validatable interface {
Validate() error
}
func (m *BaseModel) Validate() error {
if m.ID == "" {
return errors.New("ID cannot be empty")
}
if m.CreatedAt.IsZero() {
return errors.New("CreatedAt must be set")
}
return nil
}
这个项目方向很有前景!建议考虑添加以下功能:
- 完整的CRUD操作接口
- 数据迁移支持
- 查询构建器
- 性能监控集成
- 测试工具集
期待看到项目的进一步发展!我会关注仓库的更新。

