Reflection 避免反射-如何最好地重构此代码?

Reflection 避免反射-如何最好地重构此代码?,reflection,go,refactoring,Reflection,Go,Refactoring,我开始尝试围棋,到目前为止,它是一个爆炸。我决定制作一个小应用程序,帮助一个朋友在他的(小)公司组织信息和业务相关的信息,我想我会用Go来实现它 我还没有(完全)遇到一个问题,更重要的是,什么时候我应该考虑使用反射?例如,我有3种相关类型:公司、项目和员工。它们都有几个共同的字段(如id,name),因此可以想象,从数据库加载它们的函数(我使用的是MySQL)都非常相似 查看LoadCompany(),LoadStaff(),以及LoadProject(): 当我写LoadCompany()时,

我开始尝试围棋,到目前为止,它是一个爆炸。我决定制作一个小应用程序,帮助一个朋友在他的(小)公司组织信息和业务相关的信息,我想我会用Go来实现它

我还没有(完全)遇到一个问题,更重要的是,什么时候我应该考虑使用反射?例如,我有3种相关类型:
公司
项目
员工
。它们都有几个共同的字段(如
id
name
),因此可以想象,从数据库加载它们的函数(我使用的是
MySQL
)都非常相似

查看
LoadCompany()
LoadStaff()
,以及
LoadProject()

当我写
LoadCompany()
时,我对自己感觉很好(啊,作为一个初学者/中级程序员),因为它看起来很简洁。但是当我写
LoadStaff()
LoadProject()
时,我所做的只是复制和调整。我确信有更好的方法可以做到这一点,但我已经厌倦了在读完以下内容后跳入思考:

[反射]是一个强大的工具,除非绝对必要,否则应谨慎使用并避免使用

所以我的问题是,我应该使用反射吗?如果是的话,你能给我一些关于最好的技术的建议吗?这只是冰山一角,因为我觉得与这些类型相关的其他函数和方法都是重复的(不要让我开始测试!)

谢谢

类似于:

func LoadObject(sql string, id int, dest ...interface{}) error {
    db := tools.OpenDB()
    defer db.Close()
    stmt, err := db.Prepare(sql)
    if err != nil {
        log.Panic(err)
    }   
    defer stmt.Close()
    return stmt.QueryRow(id).Scan(dest)
}

// Loads the company from the database with the given id.
func LoadCompany(id int) (c Company, err error) {
    err = LoadObject("SELECT * FROM companies WHERE id = ?", &c.id,
        &c.FullName, &c.Name, &c.History, &c.Overview, &c.Est, &c.Phone, &c.Website, &c.Email)
    return
}
请注意,我还没有编译这段代码,但希望它足够好,可以给您一个想法

一些建议:

  • 通读文档:
  • 在程序启动时创建
    sql.DB
    实例
  • 在SQL语句中明确指定列顺序(
    从公司选择全名、历史记录等…

看一看。谢谢……这应该可以解决扫描重复问题,对3个功能和反射有什么建议吗?是的,几乎完美了。我所要做的就是返回行,因为Scan()将dest视为一系列项目中的第一个。谢谢
func LoadObject(sql string, id int, dest ...interface{}) error {
    db := tools.OpenDB()
    defer db.Close()
    stmt, err := db.Prepare(sql)
    if err != nil {
        log.Panic(err)
    }   
    defer stmt.Close()
    return stmt.QueryRow(id).Scan(dest)
}

// Loads the company from the database with the given id.
func LoadCompany(id int) (c Company, err error) {
    err = LoadObject("SELECT * FROM companies WHERE id = ?", &c.id,
        &c.FullName, &c.Name, &c.History, &c.Overview, &c.Est, &c.Phone, &c.Website, &c.Email)
    return
}