返回值为指针的函数

如您在第四章了解到的,在 pointerStruct.go 程序中介绍的复合类型的使用,它是一个非常好的练习,使用一个独立的函数来创建一个新的结构变量并返回指向它的指针。因此,函数返回指针是非常常见的。通常讲,函数简化程序结构并让开发者把较重要的处理逻辑集中起来,而不是总是复制相同的代码。这节将使用一个非常简单的例子,returnPtr.go

returnPtr.go 的第一部分代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func returnPtr(x int) *int {
  6. y := x * x
  7. return &y
  8. }

除了必须的引入部分,这段代码定义了一个返回 int 变量指针的新函数。唯一要记住的是使用 &yreturn 表达式来返回 y 变量的内存地址。

returnPtr.go 的第二部分如下:

  1. func main() {
  2. sq := returnPtr(10)
  3. fmt.Println("sq:", *sq)

如您所知,* 符号解引用一个指针变量,就是它返回存储在内存地址里的实际值而不是内存地址本身。

returnPtr.go 的最后一段代码如下:

  1. fmt.Println("sq:", sq)
  2. }

这段代码返回 sq 变量的内存地址,而不是存储在它里面的 int 值。

执行 returnPtr.go 将看到如下输出(内存地址可能会不同):

  1. $go run returnPtr.go
  2. sq: 100
  3. sq: 0xc420014088