英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论