来自Python,我正在学习Go并尝试围绕指针。
我写了这段代码是为了理解这个概念:
a := 1
b := &a
fmt.Println(b) // Shows the memory address of a
fmt.Println(*b) // Shows the value 1
*b++
fmt.Println(a) // Shows the value 2 (as expected)
我尝试使用此代码来提高我的理解力。但是,以下内容不起作用:
a := 1
b := &a
fmt.Println(b) // Shows the memory address of a
fmt.Println(*b) // Shows the value 1
b = *b + 1 // Compile error: invalid operation: b * +1 (mismatched types *int and int)
fmt.Println(a)
显然,*b
的类型为*int
,而值1
(显然)类型为int
。但是,为什么有可能在第一个例子中用*b++
in增加a的值?
从最开始:
b := &a
这里,b
是*int
类型,指向存储器中存储a
值的位置的指针。当您执行*b
时,您正在访问b
指针指向的位置的值。
当你做*b++
时,它代表*b = *b + 1
,你在b
指针指向的位置递增一个值。
b = *b + 1
是无效的,因为你试图将*b
和1
这两种类型的int
添加到b
,这是一个指针(*int
的类型)。
为什么不能在Go中的“dereferenced”指针变量中添加整数?
b
是一个指针和解除引用的b
被写为*b
。 b = *b + 1
无效,因为您尝试将整数转换为指针,即使明确进行类型转换也无法实现。您需要修改指针指向的数据,而不是指针本身:*b = *b + 1
。
看看这里的Go规范有关*b++
的工作原理:https://golang.org/ref/spec
运算符优先级
一元运算符具有最高优先级。由于++和 - 运算符形成语句而不是表达式,因此它们不属于运算符层次结构。因此,语句* p ++与(* p)++相同。
您正在向*int
添加int
。因此,错误。由于b是指向整数的指针,要对该整数(读或写)执行任何操作,您需要取消引用它。下面的代码将按预期工作。这就是*b++
内部所做的事情。
package main
import (
"fmt"
)
func main() {
a := 1
b := &a
fmt.Println(b) // Shows the memory address of a
fmt.Println(*b) // Shows the value 1
*b = *b + 1 // No Compile error
fmt.Println(a) // Shows the value 2
}
向取消引用(整数)指针变量添加整数是可能的,并且正确地适用于您的情况。但是,出于类型安全原因,在Go中不能接受将此值赋给指针变量。通常不需要(但有一种方法可以引用任何给定的地址)。希望这能澄清它。