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

huangapple go评论90阅读模式
英文:

Why is variable declaration not allowed here?

问题

为什么以下Go代码中的testC()无法编译通过?我期望其行为与testB()相同,只是err的作用域将被限制在if块内。

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

package main

import "fmt"

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

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

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

// 无法编译通过
func testC() {
    var resp *int
    if resp, err := generateInt(); err != nil {
        fmt.Println("error=%v", err)
        return
    }
    fmt.Println("Resp=%d", *resp)
}

// 有效
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
}

以下是翻译好的内容:为什么以下Go代码中的testC()无法编译通过?我期望其行为与testB()相同,只是err的作用域将被限制在if块内。

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

package main

import "fmt"

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

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

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

// 无法编译通过
func testC() {
    var resp *int
    if resp, err := generateInt(); err != nil {
        fmt.Println("error=%v", err)
        return
    }
    fmt.Println("Resp=%d", *resp)
}

// 有效
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
}
英文:

Why does testC() fail to compile in the following go code? I would expect that the behavior would match that of testB() with the exception that err's scope would be limited to the if block.

The error message provided by the compiler is 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
}

答案1

得分: 3

在这个例子中:

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

短变量声明重新声明了resp变量。因为if语句的作用域仅限于if块内部,它只会遮蔽该块内部的第一个resp变量,导致第一个变量未被使用。

英文:

In this example:

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

The short variable declaration is redeclaring the resp variable. Because an if's statement is scoped to the inside the if block, it only shadows the first resp variable within that block, leaving the first unused.

huangapple
  • 本文由 发表于 2015年9月23日 03:54:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/32725694.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定