2016-10-29 11 views
2

私のGoコード用のテストプログラムを作成しようとしています。このコードはmainパッケージで初期化するグローバルdb変数を持っています。データベース接続golang mysql

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

は、私がここで何をしないのですか? switch文のcase支店で宣言さ

答えて

3

変数はcaseの外に、彼らは(しない範囲で)アクセスすることはできません、ケースのブランチにをスコープしています。スペックから

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:

ソリューションはswitchstmterr変数を宣言し、代わりにshort variable declarations:=)のassignment=)を使用し、簡単です

Go is lexically scoped using blocks :
...

  1. The scope of a constant or variable identifier declared inside a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl for short variable declarations) and ends at the end of the innermost containing block.

...

そしてSpec: Blocks:

A block is a possibly empty sequence of declarations and statements within matching brace brackets.

[...] In addition to explicit blocks in the source code, there are implicit blocks:

  1. Each clause in a "switch" or "select" statement acts as an implicit block.
+0

おかげで だけので、まだ数日前golangを始め、初心者かみ合う:Pを – Ezio

関連する問題