数据库连接golang mysql

时间:2016-10-29 13:56:53

标签: mysql go switch-statement variable-declaration

我正在尝试为我的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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

switch语句的case分支中声明的变量作用域到case分支,它们在{{1}之外是不可访问的(不在范围内) }}

解决方案很简单,在case之前声明stmterr变量,并使用assignmentswitch)代替short variable declarations }(=):

:=

规范来源:

Declarations and Scope:

  

Go使用blocks进行词汇限定:
  ...

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

    ...

Spec: Blocks:

  

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

     

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

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