我正在尝试为我的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
我在这里缺少什么?
答案 0 :(得分:3)
在switch
语句的case
分支中声明的变量作用域到case分支,它们在{{1}之外是不可访问的(不在范围内) }}
解决方案很简单,在case
之前声明stmt
和err
变量,并使用assignment(switch
)代替short variable declarations }(=
):
:=
规范来源:
Go使用blocks进行词汇限定:
...
- 在函数内声明的常量或变量标识符的范围从ConstSpec或VarSpec(短变量声明的ShortVarDecl)的末尾开始,并在最内层包含块的末尾结束。
醇>...
块是匹配括号括号内的可能为空的声明和语句序列。
[...]除了源代码中的显式块之外,还有隐式块: