Go的指针操作
在程序运行时,变量存储在内存中,每个变量都对应一个内存地址,通过内存地址可以获得内存地址上存储的数据。可以认为,指针就是内存地址。Go语言中指针不能进行运算,相对比较简单。
在本文中,将全程使用完整的变量定义语法。
Go的指针操作与其他大多数语言一样,使用两个符号进行操作
&:取地址
*:取值
取地址
对一个变量取地址,并打印其内存地址
func main() {
var a int = 10
fmt.Printf("%p", &a) // 0xc00000eb40
}
使用“&”符号,得到变量a的内存地址0xc00000eb40。
取值
对指针变量取值,或者说是获取内存地址上的数据
func main() {
var a int = 10
var b *int = nil // 定义一个指针变量b
b = &a // 将变量a的地址给指针变量b
fmt.Println(*b) // 10
}
使用“*”符号,对指针变量b取值,值为10。
操作指针
明白了取地址、取值操作后,现在来进一步看看如何操作数据
1
func main() { var a int = 10 var b *int = nil b = &a // 指针变量b指向变量a的内存地址 *b = 20 // 将内存地址上的数据赋值为20 fmt.Println(a) // 20 }
以上例程中,变量a被修改为20。
2
func modify(n *int) { *n = 30 // 将内存地址上的数据赋值为30 } func main() { var a int = 10 modify(&a) // 传入变量a的内存地址 fmt.Println(a) // 30 }
以上例程中,变量a被修改为30。需要注意的是,函数modify形参n类型为指针类型,所以在调用时需要传入内存地址,在函数modify内部操作内存地址上的数据。会PHP的朋友可能很熟悉,这里的操作类似于PHP中的引用,但PHP中不存在指针这个概念。