如果我在if块中创建一个变量,我以后就不能使用了。如果我在if块之前创建变量并且if块的计算结果为false,则会出现“变量已创建且未使用”错误。
我确信这是设计上的,我正在尝试做一些我不应该做的事情,但我正在尝试做的事情背后的逻辑对我来说是有意义的。如果url中有页面信息,我想稍后在sql语句中使用它,但如果url中没有页面信息,那么我不需要那些变量。
编辑:这是代码:
var pageID string
var offset int
if len(r.URL.Path) > len("/page/") {
pageID := r.URL.Path[len("/page/"):]
offset, err := strconv.Atoi(pageID)
if err != nil {
log.Fatal(err)
}
}
conn := "..."
db, err := sql.Open("mysql", conn)
defer db.Close()
if err != nil {
log.Fatal(err)
}
var rows *sql.Rows
if offset != 0 {
// ...
}
答案 0 :(得分:5)
如果在if
语句之前声明变量并在if
块中使用它,那么条件的计算结果并不重要,它不是编译时错误。
您遇到的错误是您不在if
块中使用声明的变量。你的代码:
var pageID string
var offset int
if len(r.URL.Path) > len("/page/") {
pageID := r.URL.Path[len("/page/"):]
offset, err := strconv.Atoi(pageID)
if err != nil {
log.Fatal(err)
}
}
在if
内你没有分配给之前声明的pageID
,但你正在使用short variable declaration :=
创建一个新变量,遮蔽在该变量中创建的变量外部块,它仅在if
块的末尾有效(其范围在最内层包含块的末尾结束)。
解决方案是(你最想要的)只使用赋值=
(它为现有变量赋值):
pageID = r.URL.Path[len("/page/"):]
要理解,请参阅此示例:
i := 1
fmt.Println("Outer:", i)
{
i := 2 // Short var decl: creates a new i, shadowing the outer
fmt.Println("Inner:", i)
}
fmt.Println("Outer again:", i)
输出(在Go Playground上尝试):
Outer: 1
Inner: 2
Outer again: 1