我在 Go 中创建了一个非关系的对象映射,它非常简单。
我有几个看起来像这样的结构:
type Message struct {
Id int64
Message string
ReplyTo sql.NullInt64 `db:"reply_to"`
FromId int64 `db:"from_id"`
ToId int64 `db:"to_id"`
IsActive bool `db:"is_active"`
SentTime int64 `db:"sent_time"`
IsViewed bool `db:"is_viewed"`
Method string `db:"-"`
AppendTo int64 `db:"-"`
}
要创建新消息,我只需运行此函数:
func New() *Message {
return &Message{
IsActive: true,
SentTime: time.Now().Unix(),
Method: "new",
}
}
然后我有一个用于这个结构的 message_crud.go 文件,如下所示:
要按唯一列(例如按 id)查找消息,我运行此函数:
func ByUnique(column string, value interface{}) (*Message, error) {
query := fmt.Sprintf(`
SELECT *
FROM message
WHERE %s = ?
LIMIT 1;
`, column)
message := &Message{}
err := sql.DB.QueryRowx(query, value).StructScan(message)
if err != nil {
return nil, err
}
return message, nil
}
为了保存消息(在数据库中插入或更新),我运行了这个方法:
func (this *Message) save() error {
s := ""
if this.Id == 0 {
s = "INSERT INTO message SET %s;"
} else {
s = "UPDATE message SET %s WHERE id=:id;"
}
query := fmt.Sprintf(s, sql.PlaceholderPairs(this))
nstmt, err := sql.DB.PrepareNamed(query)
if err != nil {
return err
}
res, err := nstmt.Exec(*this)
if err != nil {
return err
}
if this.Id == 0 {
lastId, err := res.LastInsertId()
if err != nil {
return err
}
this.Id = lastId
}
return nil
}
但是每次我创建一个新的结构,例如一个用户结构时,我必须复制粘贴上面的“crud 部分”并创建一个 user_crud.go 文件并将“消息”替换为“用户”,并将“消息”替换为“消息”与“用户”。我重复了很多代码,它不是很枯燥。有什么我可以做的事情,我可以不为我会重用的东西重复这段代码吗?我总是有一个 save() 方法,并且总是有一个 ByUnique() 函数,我可以在其中返回一个结构并按唯一的列进行搜索。
在 PHP 中这很容易,因为 PHP 不是静态类型的。
这可以在 Go 中做到吗?
拉风的咖菲猫
慕丝7291255
HUX布斯
相关分类