Golang中如何为IF/Else语句声明单个变量
Golang中如何为IF/Else语句声明单个变量
你好
我在尝试声明变量并在if/else语句中使用时遇到了问题。我是Go语言的新手,只是想做一些有趣的东西。这是我的问题,如果我这样做,一切正常:
```go
query, err := "test", errors.Errorf("IF statement error")
fmt.Print(query, err)
但如果我这样做,就会得到未使用变量和未解析引用的错误:
if (tablename == "test"){
query, err := "test", errors.Errorf("IF statement error")
} else {
query, err := "anothertest", errors.Errorf("Else statement Error")
}
fmt.Print(query, err)
有什么想法可以解决这个问题吗?
更多关于Golang中如何为IF/Else语句声明单个变量的实战教程也可以访问 https://www.itying.com/category-94-b0.html
iegomez:
var query string
var err error
太棒了!!!这就是正确答案!这对我尝试做的事情很有帮助。
更多关于Golang中如何为IF/Else语句声明单个变量的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
package main
import (
"fmt"
)
var (
query string
err error
)
func main() {
tablename := "foobar"
if (tablename == "test"){
err, query = fmt.Errorf("IF statement error"),"test"
} else {
err, query = fmt.Errorf("Else statement error"),"anothertest"
}
fmt.Printf("My query is: %s and error is: %s", query, err)
}
请注意,给定的示例声明了全局变量 query 和 err。您可以通过将其更改为以下形式,将它们保留在 main 函数的局部作用域中:
package main
import (
"fmt"
)
func main() {
var query string
var err error
tablename := "foobar"
if (tablename == "test"){
err, query = fmt.Errorf("IF statement error"),"test"
} else {
err, query = fmt.Errorf("Else statement error"),"anothertest"
}
fmt.Printf("My query is: %s and error is: %s", query, err)
}
为什么这很重要?因为当您在 if/else 语句中声明 query 和 error 时,它们的作用域仅限于该语句块,因此在函数作用域中不可见。一个典型的例子是当您有某个错误,然后在错误检查中重新声明并遮蔽了该错误:
err := errors.New("outer error")
if err != nil {
err := someErroringFunc()
//现在 err 指向最新的错误,并遮蔽了外部的 err。
fmt.Println(err) //这将打印来自 someErrorFunc() 的错误。
}
fmt.println(err) // 这将打印 "outer error"
在Go语言中,变量作用域是块级的。在你的代码中,query和err在if和else块内部声明,这意味着它们的作用域仅限于各自的块内。当你在if和else块外部尝试使用这些变量时,它们超出了作用域,因此编译器会报错。
正确的做法是在if语句之前声明变量,然后在if和else块中进行赋值。这样,变量在整个函数作用域内都是可用的。以下是修改后的代码示例:
var query string
var err error
if tablename == "test" {
query, err = "test", errors.Errorf("IF statement error")
} else {
query, err = "anothertest", errors.Errorf("Else statement Error")
}
fmt.Print(query, err)
在这个例子中,query和err在if语句之前被声明为string和error类型。在if和else块中,我们使用赋值操作符=而不是短变量声明:=,因为变量已经被声明了。这样,query和err在fmt.Print语句中就是可用的。
另一种方法是使用短变量声明,但需要确保在同一个作用域内。例如,如果整个逻辑封装在一个函数中,可以这样写:
func main() {
tablename := "test" // 示例值
var query string
var err error
if tablename == "test" {
query, err = "test", errors.Errorf("IF statement error")
} else {
query, err = "anothertest", errors.Errorf("Else statement Error")
}
fmt.Print(query, err)
}
这样,query和err在main函数的作用域内始终有效,避免了作用域问题。

