第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

避免反射 - 如何最好地重構(gòu)此代碼?

避免反射 - 如何最好地重構(gòu)此代碼?

Go
大話西游666 2021-11-29 16:57:42
我開(kāi)始嘗試使用 Go,到目前為止,它一直是一個(gè)爆炸。我決定做一個(gè)小應(yīng)用程序來(lái)幫助朋友在他的(?。┕窘M織信息業(yè)務(wù)相關(guān)的信息,我想我會(huì)用Go來(lái)實(shí)現(xiàn)它。我還沒(méi)有(完全)遇到問(wèn)題,更多的是一個(gè)問(wèn)題,我什么時(shí)候應(yīng)該考慮使用反射?例如,我有 3 個(gè)相關(guān)類(lèi)型:Company,Project和Staff. 它們都有幾個(gè)共同的字段(例如id, name),因此您可以想象,從數(shù)據(jù)庫(kù)(我正在使用MySQL)加載它們的函數(shù)都非常相似??碙oadCompany(), LoadStaff(), 和LoadProject():// Loads the company from the database with the given id.func LoadCompany(id int) (Company, error) {    db := tools.OpenDB()    defer db.Close()    stmt, err := db.Prepare("SELECT * FROM companies WHERE id = ?")    if err != nil {        log.Panic(err)    }       var c Company     err = stmt.QueryRow(id).Scan(&c.id, &c.FullName, &c.Name, &c.History, &c.Overview, &c.Est, &c.Phone, &c.Website, &c.Email)    if err != nil {        return Company{}, err     }       return c, nil }// Loads the staff from the database with the given id.func LoadStaff(id int) (Staff, error) {    db := tools.OpenDB()    defer db.Close()    stmt, err := db.Prepare("SELECT * FROM staff WHERE id = ?")    if err != nil {        log.Panic(err)    }    var s Staff    err = stmt.QueryRow(id).Scan(&s.id, &s.FullName, &s.Name, &s.Email, &s.Joined, &s.Left, &s.History, &s.Phone, &s.Position)    if err != nil {        return Staff{}, err    }    return s, nil}// Loads the project from the database with the given id.func LoadProject(id int) (Project, error) {    db := tools.OpenDB()    defer db.Close()    stmt, err := db.Prepare("SELECT * FROM projects WHERE id = ?")    if err != nil {        log.Panic(err)    }    var p Project    err = stmt.QueryRow(id).Scan(&p.id, &p.Title, &p.Overview, &p.Value, &p.Started, &p.Finished, &p.Client, &p.Architect, &p.Status)    if err != nil {        return Project{}, err    }    return p, nil}當(dāng)我寫(xiě)的時(shí)候LoadCompany(),我對(duì)自己感覺(jué)很好(嗯,作為一個(gè)初學(xué)者/中級(jí)程序員)因?yàn)樗雌饋?lái)很小很干凈。但是當(dāng)我寫(xiě)LoadStaff()和的時(shí)候LoadProject(),我所做的只是復(fù)制和調(diào)整。我確信有更好的方法可以做到這一點(diǎn),但是在閱讀了Pike 的帖子后,我已經(jīng)厭倦了進(jìn)行反思:[反射是]一種強(qiáng)大的工具,除非絕對(duì)必要,否則應(yīng)謹(jǐn)慎使用并避免使用。所以我的問(wèn)題是,我應(yīng)該使用反射嗎,如果是這樣,你能給我一些關(guān)于最好的技術(shù)的建議嗎?這只是冰山一角,因?yàn)槲矣X(jué)得與這些類(lèi)型相關(guān)的其余函數(shù)和方法似乎都是類(lèi)似的重復(fù)(不要讓我開(kāi)始測(cè)試?。?。
查看完整描述

1 回答

?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

就像是:


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

}

請(qǐng)注意,我還沒(méi)有編譯此代碼,但希望它足以給您一個(gè)想法。


幾點(diǎn)建議:

  • 通讀文檔:https : //golang.org/pkg/database/sql/

  • sql.DB在程序啟動(dòng)時(shí)創(chuàng)建實(shí)例

  • 在 SQL 語(yǔ)句中顯式指定列順序 ( select full_name, history, .... from companies ....)


查看完整回答
反對(duì) 回復(fù) 2021-11-29
  • 1 回答
  • 0 關(guān)注
  • 171 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)