golang如何将这两个功能结合起来?

时间:2018-04-09 08:18:10

标签: go

我想学习在golang中编写干净的代码,我的问题是:我有两个函数,我需要组合才能成为一个,这是我的实际代码:

func db_execute(sql_cmd string) bool {

    db, err := sql.Open("mysql", mysql_login)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }

    stmt, err := db.Prepare(sql_cmd)
    if err != nil {
        fmt.Print(err.Error())
    }
    _, err = stmt.Exec()

    if err != nil {
        fmt.Print(err.Error())
        return false
    }

    return true
}

func db_tabela_select(cod_cliente string) (id string, cod1 string, cod2 string, cod3 string) {

    db, err := sql.Open("mysql", mysql_login)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }

    err = db.QueryRow("select id, cod1, cod2, cod3 from db_tabela WHERE `cliente`=? LIMIT 1;", cod_cliente).Scan(
                        &id, &cod1, &cod2, &cod3)

    switch {
        case err == sql.ErrNoRows:
                log.Printf("No codice cliente with that ID.")
        case err != nil:
                log.Printf("database select problems")
        default:
                fmt.Printf("Client code is %s %s %s\n", cod1, cod2, cod3)
    }

    return id, cod1, cod2, cod3
}

如何将这两个功能合二为一?这些功能有不同的输入和不同的输出。

1 个答案:

答案 0 :(得分:2)

你不应该"结合"那些功能。他们常见的是什么,移动他们" out",例如到第3个函数,可以被这些2调用。

此外,连接到数据库不应该是"本地"操作,它应该只进行一次,例如在包init()函数中。

此外,可能失败的函数(db操作是这些函数的典型示例)应该返回错误,因此可以在调用者处进行检查和处理。

这是一个更简单,更强大,更惯用的解决方案:

var db *sql.DB

func init() {
    var err error
    db, err = sql.Open("mysql", "db_url_string")
    if err != nil {
        log.Fatal(err)
    }

    if err = db.Ping(); err != nil {
        log.Fatal(err)
    }
}

func dbExecute(sql_cmd string) error {
    stmt, err := db.Prepare(sql_cmd)
    if err != nil {
        return err
    }
    _, err = stmt.Exec()
    return err
}

func dbTabelaSelect(cod_cliente string) (id, cod1, cod2, cod3 string, err error) {
    query := "select id, cod1, cod2, cod3 from db_tabela WHERE 'cliente'=? LIMIT 1"
    err = db.QueryRow(query, cod_cliente).Scan(&id, &cod1, &cod2, &cod3)
    return
}

使用这些功能的示例:

func main() {
    defer db.Close() // Graceful shutdown

    if err := dbExecute("some_SQL"); err != nil {
        fmt.Print("SQL execution failed: %v", err)
    }

    id, cod1, cod2, cod3, err := dbTabelaSelect("someID")
    switch {
    case err == sql.ErrNoRows:
        log.Printf("No codice cliente with that ID.")
    case err != nil:
        log.Printf("database select problems")
    default:
        fmt.Printf("Client code is %s %s %s %s\n", id, cod1, cod2, cod3)
    }
}