如何在Golang中声明SQL行,如果else语句未声明问题

问题描述 投票:0回答:2

我下面有这样的代码。

    var sql string

if pnt.Type == "newType" {
    sql = `select code, count(*) count from ( 
                select code 
                    from code_table 
                    where start >= ? and end <= ? 
                union 
                select code 
                    from code_table 
                    where start >= ? and end <= ? 
                ) a group by code`
    rows, err := pnt.switchConn("base", "read").Query(sql, start, end, start, end)
} else {
    sql = `select code, count(*) count from code_table where start >= ? and end <= ?` group by code
    rows, err := pnt.switchConn("base", "read").Query(sql, start, end)
}

if err == nil {
    defer rows.Close()
    for rows.Next() {
        var code, count int
        rows.Scan(&code, &count)
    }
} else {
    log.Println(err)
}

这将给我一个类似这样的错误:“未为行声明变量,err” ...

我尝试声明“ var err error”,并且在if else语句中,我使用=而不是:=像这样的东西

var err error
rows, err = pnt.switchConn("base", "read").Query(sql, start, end)

但是,我仍然无法声明行,因为我会遇到不同类型的错误。我尝试将其声明为字符串,但没有运气。

这是我第一次使用golang,如果使用if else会给我带来麻烦,为什么我不能在if else语句中只使用:=。如您所见,我不能在if else语句之外使用err:=行,因为cuz都有不同数量的参数。

go
2个回答
0
投票

由于变量的范围,您遇到了问题。在Golang中,:=在新变量中创建一个新变量。

rows, err := pnt.switchConn("base", "read").Query(sql, start, end, start, end)

rows块中创建一个新的errif变量,如果在if块之外则无法访问。

Shorthand declarations in Go

修复,

var sql string
var err error
var rows *sql.Rows

if pnt.Type == "newType" {
    sql = `select code, count(*) count from ( 
                select code 
                    from code_table 
                    where start >= ? and end <= ? 
                union 
                select code 
                    from code_table 
                    where start >= ? and end <= ? 
                ) a group by code`
    rows, err = pnt.switchConn("base", "read").Query(sql, start, end, start, end)
} else {
    sql = `select code, count(*) count from code_table where start >= ? and end <= ?` group by code
    rows, err = pnt.switchConn("base", "read").Query(sql, start, end)
}

if err == nil {
    defer rows.Close()
    for rows.Next() {
        var code, count int
        rows.Scan(&code, &count)
    }
} else {
    log.Println(err)
}

0
投票

在golang中“:=”表示您声明了一个变量并为其分配了此值,GO将自动检测其类型,因此:Exemplesvariable := 15一样的var variable int = 15

因此,当您执行此rows, err := pnt.switchConn("base", "read").Query(sql, start, end, start, end) } else { sql =选择代码时,从code_table的count(*)开始> =?并结束<=?group by code rows, err := pnt.switchConn("base", "read").Query(sql, start, end) } 您声明相同的变量行,并两次犯错

© www.soinside.com 2019 - 2024. All rights reserved.