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

4 回复

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)
}

https://play.golang.org/p/Ao8yZP3vmGW

请注意,给定的示例声明了全局变量 queryerr。您可以通过将其更改为以下形式,将它们保留在 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 语句中声明 queryerror 时,它们的作用域仅限于该语句块,因此在函数作用域中不可见。一个典型的例子是当您有某个错误,然后在错误检查中重新声明并遮蔽了该错误:

err := errors.New("outer error")
if err != nil {
   err := someErroringFunc()
   //现在 err 指向最新的错误,并遮蔽了外部的 err。
   fmt.Println(err) //这将打印来自 someErrorFunc() 的错误。
}
fmt.println(err) // 这将打印 "outer error"

在Go语言中,变量作用域是块级的。在你的代码中,queryerrifelse块内部声明,这意味着它们的作用域仅限于各自的块内。当你在ifelse块外部尝试使用这些变量时,它们超出了作用域,因此编译器会报错。

正确的做法是在if语句之前声明变量,然后在ifelse块中进行赋值。这样,变量在整个函数作用域内都是可用的。以下是修改后的代码示例:

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)

在这个例子中,queryerrif语句之前被声明为stringerror类型。在ifelse块中,我们使用赋值操作符=而不是短变量声明:=,因为变量已经被声明了。这样,queryerrfmt.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)
}

这样,queryerrmain函数的作用域内始终有效,避免了作用域问题。

回到顶部