【问题标题】:Database Connection golang mysql数据库连接 golang mysql
【发布时间】:2016-10-29 13:56:52
【问题描述】:

我正在尝试为我的 Go 代码编写一个测试程序。这段代码有一个全局的 db 变量,我在 main 包中初始化它。

package database

import(
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

//Data type that defines one identity
type element struct {
     title string
     date string
     url string
     remoteUrl string
}


//global database object for every package
var (
   db *sql.DB
)

// params  elem : element to be inserted ,     folder     : folderName 
func insertNoticeData( elem element, folder string) bool  {

     switch folder {
         case "Results" : stmt, err := db.Prepare("INSERT results_ipu SET title=?, date=?, url=?, remoteUrl=?")
         case "Notices" : stmt, err := db.Prepare("INSERT notice_ipu SET title=?, date=?, url=?, remoteUrl=?")
         case "Datesheets" : stmt, err := db.Prepare("INSERT datesheet_ipu SET title=?, date=?, url=?, remoteUrl=?")
     }

     res, err1 := stmt.Exec(elem.title, elem.date, elem.url, elem.remoteUrl)
     if err1 != nil {
     fmt.Println("Error inserting in database ")
     return false
     }
     return true
}

它给了我一个错误:undefined symbol stmt

我在这里错过了什么?

【问题讨论】:

    标签: mysql go switch-statement variable-declaration


    【解决方案1】:

    switch 语句的case 分支中声明的变量是作用域到case 分支的,它们在case 之外无法访问(不在作用域内)。

    解决方法很简单,在switch之前声明stmterr变量,并使用assignment=)代替short variable declarations:=):

    var stmt *sql.Stmt
    var err error
    
    switch folder {
    case "Results":
        stmt, err = db.Prepare("INSERT results_ipu SET title=?, date=?, url=?, remoteUrl=?")
    case "Notices":
        stmt, err = db.Prepare("INSERT notice_ipu SET title=?, date=?, url=?, remoteUrl=?")
    case "Datesheets":
        stmt, err = db.Prepare("INSERT datesheet_ipu SET title=?, date=?, url=?, remoteUrl=?")
    }
    
    if err != nil {
        // handle error
    }
    
    res, err1 := stmt.Exec(elem.title, elem.date, elem.url, elem.remoteUrl)
    

    来自规范的来源:

    Declarations and Scope:

    Go 的词法范围使用 blocks:
    ...

    1. 在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,到最里面的包含块的末尾结束。

    ...

    还有Spec: Blocks:

    块是匹配括号内的可能为空的声明和语句序列。

    [...] 源代码中除了显式块外,还有隐式块:

    1. "switch""select" 语句中的每个子句都充当隐式块。

    【讨论】:

    • 感谢朋友几天前刚开始使用golang,所以还是个新手:P
    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 2013-12-01
    • 2023-03-27
    • 1970-01-01
    • 2020-05-23
    • 2018-12-21
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多