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 的值也会被更改。
这是因为 num 和 number 引用的是内存中的同一地址。因此,更新一个也会更新另一个。
从函数返回指针
与常规变量一样,我们也可以从函数返回指针。例如:
// 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 的内存地址。