跳到主要内容

Go 指针和函数

提示
  1. 函数中使用指针作为参数:在 Go 中,可以将指针作为函数参数传递。通过改变指针指向的内存地址中的数据,可以影响原始变量的值。
  2. 从函数返回指针:与普通变量一样,函数也可以返回指针。这样的函数返回指向特定数据的内存地址,可以在函数外部访问和修改这些数据。
  3. 引用传递(Call by Reference):在 Go 中,通过传递变量的内存地址作为指针给函数,实现了引用传递。这意味着函数可以直接修改传递的变量的值,而不是它的副本。

Go 指针存储变量的内存地址。就像普通变量一样,我们也可以将指针传递给函数。

在学习如何将指针与函数一起使用之前,请确保了解

Golang 中作为函数参数的指针

在 Go 中,我们可以将指针作为参数传递给函数。例如,

// 将指针作为函数参数传递的程序

package main
import "fmt"

// 函数定义,带有指针参数
func update(num *int) {

// 解引用指针
*num = 30

}

func main() {

var number = 55

// 函数调用
update(&number)

fmt.Println("数字是", number)

}

输出

数字是 30

在上述示例中,我们将 number 的地址传递给了 update() 函数。指针 num 在函数定义中接受此参数。

func update(num *int) {
...
}

当我们在 update() 函数内将 *num 更改为 30 时,main() 函数内的 number 的值也随之更改。

这是因为 num 和 number 指向内存中的同一地址。因此,更新一个也会更新另一个。

从函数返回指针

就像普通变量一样,我们也可以从函数中返回指针。例如,

// 从函数返回指针的程序

package main
import "fmt"

func main() {

// 函数调用
result := display()
fmt.Println("欢迎来到", *result)

}

func display() *string {

message := "Programiz"

// 返回 message 的地址
return &message

}

输出

欢迎来到 Programiz

在上述示例中,我们创建了一个名为 display() 的函数,该函数返回一个指针。

func display() *string

这里,*string 表示函数返回 string 类型的指针。

注意 display() 函数中的 return &message 语句:

func display() *string {
...
return &message
}

这表明函数将 message 变量的地址返回给 main() 函数。

返回的地址被分配给 result 指针。为了获取存储在内存地址中的值,我们使用了代码 *result

引用调用

在将指针传递给函数时,我们实际上是传递了变量的引用(地址)。我们不是直接操作实际值,而是通过引用操作,例如

  • 使用引用访问值
  • 使用引用更改值

这就是为什么这种使用指针调用函数的过程在 Go 中被称为引用调用

让我们看一个示例。

// 说明引用调用的程序

package main
import "fmt"

// 按值调用
func callByValue(num int) {

num = 30
fmt.Println(num) // 30

}

// 按引用调用
func callByReference(num *int) {

*num = 10
fmt.Println(*num) // 10

}

func main() {

var number int

// 传递值
callByValue(number)

// 传递引用(地址)
callByReference(&number)

}

这里,我们创建了两个函数:callByValue()callByReference()

callByValue() 函数中,我们直接传递了 number 变量。而在 callByReference() 中,我们传递了 number 的内存地址。