如果条件为真,如何在go中创建变量?

0 variables go

如果我在if块中创建一个变量,我以后就不能使用它了.如果我在if块之前创建变量并且if块的计算结果为false,则会出现"变量已创建且未使用"错误.

我确信这是设计的,我正在尝试做一些我不应该做的事情,但我正在尝试做的事情背后的逻辑对我来说是有意义的.如果url中有页面信息,我想稍后在sql语句中使用它,但如果url中没有页面信息,那么我不需要那些变量.

http://pastebin.com/QqwpdM1d

编辑:这是代码:

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 {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

里面的if你是不是分配给先前声明的pageID,但使用的是短变量声明 :=这将创建一个新的变量,遮蔽外部块中创建的,并且只在年底生效if块(其范围在结束最里面的包含块的结尾).

解决方案是(你最想要的)简单地使用赋值=(它为现有变量赋值):

    pageID = r.URL.Path[len("/page/"):]
Run Code Online (Sandbox Code Playgroud)

要使其理解,请参阅此示例:

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)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

Outer: 1
Inner: 2
Outer again: 1
Run Code Online (Sandbox Code Playgroud)