Go 指针和函数

Go 指针存储变量的内存地址。与常规变量一样,我们也可以将指针传递给函数。

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


Golang 中将指针作为函数参数

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

// Program to pass pointer as a function argument

package main
import "fmt"
// function definition with a pointer argument func update(num *int) {
// dereference the pointer *num = 30 } func main() { var number = 55
// function call update(&number)
fmt.Println("The number is", number) }

输出

The number is 30

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

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

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

这是因为 numnumber 引用的是内存中的同一地址。因此,更新一个也会更新另一个。


从函数返回指针

与常规变量一样,我们也可以从函数返回指针。例如:

// Program to return a pointer from a function

package main
import "fmt"
 
func main() {

  // function call
  result := display() 
  fmt.Println("Welcome to", *result)

} 

func display() *string { message := "Programiz" // returns the address of message return &message }

输出

Welcome to Programiz

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

func display() *string

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

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

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

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

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


按引用调用

在将指针传递给函数时,我们实际上传递的是变量的引用(地址)。我们不是直接处理实际值,而是像这样处理引用:

  • 通过引用访问值
  • 通过引用更改值

因此,这种通过指针调用函数的过程在 Go 中称为按引用调用

让我们看一个例子。

// Program to illustrate call by reference

package main
import "fmt"

// call by value
func callByValue(num int) {

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

} 

// call by reference
func callByReference(num *int) {
    
  *num = 10
  fmt.Println(*num) // 10

} 

func main() {
 
  var number int

// passing value callByValue(number) // passing a reference (address) callByReference(&number)
}

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

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

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战