跳转到主要内容

【Go语言高级开发】Go 指针教程

在本教程中,我们将介绍 Go 中的指针以及如何在自己的 Go 程序中使用它们。我们将介绍最佳实践,并介绍一些最常见的指针用例。

在本教程结束时,您将对指针以及如何使用它们有一个扎实的理解。

介绍


在 Go 中,当我们调用一个函数并将一堆参数传递给该函数时,该语言会创建参数的副本,然后在所述函数中使用这些副本。例如:

main.go

package main

import "fmt"

func myTestFunc(a int) {
    a += 3
    fmt.Println(a)
}

func main() {
    a := 2
    myTestFunc(a)
    fmt.Println(a) // prints out 2
}

在上面的代码中,myTestFunc 接收一个整数变量,并对其进行复制,以便在函数体的上下文中使用。我们对 myTestFunc 中的 a 所做的任何更改都只会保留在 myTestFunc 函数的主体中。

现在,假设我们想调用 myTestFunc 并更新原来的 a 变量并将 3 添加到它?

【Go语言高级开发】理解 Go 中的指针

介绍


当你用 Go 编写软件时,你将编写函数和方法。您将数据作为参数传递给这些函数。有时,该函数需要数据的本地副本,而您希望原始数据保持不变。例如,如果您是一家银行,并且您有一个功能可以根据用户选择的储蓄计划向用户显示他们的余额变化,那么您不希望在客户选择计划之前更改他们的实际余额;您只想在计算中使用它。这称为按值传递,因为您将变量的值发送给函数,而不是变量本身。

其他时候,您可能希望函数能够更改原始变量中的数据。例如,当银行客户向他们的账户存款时,您希望存款功能能够访问实际余额,而不是副本。在这种情况下,您不需要将实际数据发送给函数;你只需要告诉函数数据在内存中的位置。称为指针的数据类型保存数据的内存地址,但不保存数据本身。内存地址告诉函数在哪里找到数据,而不是数据的值。您可以将指针传递给函数而不是数据,然后函数可以就地更改原始变量。这被称为通过引用传递,因为变量的值并没有传递给函数,只是它的位置。

在本文中,您将创建和使用指针来共享对变量内存空间的访问。