go - 为什么这里不允许声明变量?

标签 go

为什么testC()在下面的go代码中编译失败?我希望该行为与 testB() 的行为相匹配,但 err 的范围仅限于 if block 。

编译器提供的错误信息是resp declared and not used

package main

import "fmt"

func main() {
    testA()
    testB()
    testC()
    testD()
}

// valid
func testA() {
    resp, err := generateInt()
    fmt.Println(fmt.Sprintf("Resp=%v Error=%v", resp, err))
}

// valid
func testB() {
    var resp *int
    resp, err := generateInt()
    fmt.Println(fmt.Sprintf("Resp=%v Error=%v", resp, err))
}

// does not compile
func testC() {
    var resp *int
    if resp, err := generateInt(); err != nil {
        fmt.Println("error=%v", err)
        return
    }
    fmt.Println("Resp=%d", *resp)
}

// valid
func testD() {
    var resp *int
    var err error
    if resp, err = generateInt(); err != nil {
        fmt.Println("error=%v", err)
        return
    }
    fmt.Println("Resp=%d", *resp)
}

func generateInt() (*int, error) {
    result := 5
    return &result, nil
}

最佳答案

在这个例子中:

var resp *int
if resp, err := generateInt(); err != nil {

short variable declaration正在重新声明 resp 变量。因为 if 语句的作用域在 if block 内部,所以它只会隐藏该 block 中的第一个 resp 变量,而第一个未被使用。

关于go - 为什么这里不允许声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725694/

相关文章:

go - 获取redis golang的队列长度

google-app-engine - 如何在 App Engine/Heroku 中以 worker 身份运行非 Web Go 应用程序

go - 将整数转换为 float

Golang : Slice and make

go - Golang中的0x1是什么意思?

go - go中如何导入本地包?

go - 如何使用 mapstructure 标签作为 json 标签?

time - 如何从非英语字符串中解析月份

go - 管道API的 curl 命令

go - Geth如何保持区 block 链状态?