3 回答
TA贡献1840条经验 获得超5个赞
我认为用户变量没有重新声明,但它的值当然被覆盖了。我已经通过检查变量的指针地址进行了测试,如下所示。如您所见,用于捕获变量地址的指针保持不变。
https://play.golang.org/p/bj3QwSgCCiG
剪断:
func main() {
user := User{"Name"}
up1 := &user
user, err := functionThatReturnsTwoValues()
up2 := &user
if err == nil {
fmt.Printf("User: %v \n", user)
fmt.Printf("Pointer check : up1 ?= up2 --> %t [up1=%p, up2=%p]\n", up1 == up2, up1, up2)
fmt.Printf("Value check : *up1 ?= *up2 --> %t \n", *up1 == *up2)
}
}
输出是:
User: {Name2}
Pointer check : up1 ?= up2 --> true [up1=0x40c138, up2=0x40c138]
Value check : *up1 ?= *up2 --> true
TA贡献1804条经验 获得超3个赞
是的,变量被重新声明并且它的值被覆盖。但它仍然必须具有相同的类型声明。重新声明本质上是一个赋值,并使用相同的堆栈内存。
规范明确允许这样做,以使定义 err 等情况更整洁:
与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块(或参数列表,如果该块是函数体)中以相同类型声明的,并且至少有一个非空白变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不引入新变量;它只是为原始值分配一个新值。- https://golang.org/ref/spec#Short_variable_declarations
例如:
var user User
user, err := fetchUser() // OK: user redeclared but new err variable declared
user, err := fetchUser() // Bad: user and err variable redeclared, but no new variables declared
user, err = fetchUser() // OK: No declarations, only assignments
- 3 回答
- 0 关注
- 169 浏览
添加回答
举报