Go 使用指针,指针是另一个与变量相关且必须掌握的要素。在Go语言中声明变量时,将在计算机内存中给它分配一个位置,以便能够存储、修改和获取变量的值。要获取变量在计算机内存中的地址,可在变量名前加上&字符。如下程序将一个变量的内存地址打印到终端。
package main
import (
"fmt"
)
func main() {
s := "Hello World,www.coolcou.com"
fmt.Println(&s)
}
如果您运行这些代码,将打印一个由字母和数字组成的序列,它表示变量在内存中的地址,而不是变量的值。
输出结果如下:
这是内存地址的十六进制表示。如果您不知道十六进制为何物,也不用担心,您只需知道每个变量的值都存储在不同的内存地址中就够了。如下程序将一个整型变量传递给了一个函数,并打印了两个变量的内存地址。您认为它们的内存地址相同吗?
package main
import (
"fmt"
)
func showMemoryAddress(x *int) {
fmt.Println(x)
return
}
func main() {
i := 1
fmt.Println(&i)
showMemoryAddress(&i)
}
这个程序运行时显示两个内存地址。
将变量传递给函数时,会分配新内存并将变量的值复制到其中。这样将有两个变量实例,它们位于不同的内存单元中。一般而言,这不可取,因为这将占用更多的内存,同时由于存在变量的多个副本,很容易引入Bug。考虑到这一点,Go提供了指针。
指针是Go语言中的一种类型,指向变量所在的内存单元。要声明指针,可在变量名前加上星号字符。可将前面的示例修改成如下所示的代码,以使用指针。
package main
import (
"fmt"
)
func showMemoryAddress(x *int) {
fmt.Println(x)
return
}
func main() {
i := 1
fmt.Println(&i)
showMemoryAddress(&i)
}
这个程序运行时显示两个内存地址。
对代码的修改情况说明如下。
- 将传递给showMemoryAddress的值从i改成了
&i
。i前面的和号&意味着引用的是变量i的值所在的内存地址。 - 将函数showMemoryAddress的第一个参数的类型从int改成了
*int
。加上星号意味着参数的类型为指向整数的指针,而不是整数。 - 在函数showMemoryAddress中打印变量时,不需要使用和号,因为它本来就是指针。
如果要使用指针指向的变量的值,而不是其内存地址,该怎么办呢?可在指针变量前加上星号。
func showMemoryAddress(x *int) {
fmt.Println(*x)
return
}
使用星号后,打印的是值而不是内存地址。
酷客教程相关文章:
评论前必须登录!
注册