Go 指针 和函数
提示
- 函数中使用指针作为参数:在 Go 中,可以将指针作为函数参数传递。通过改变指针指向的内存地址中的数据,可以影响原始变量的值。
- 从函数返回指针:与普通变量一样,函数也可以返回指针。这样的函数返回指向特定数据的内存地址,可以在函数外部访问和修改这些数据。
- 引用传递(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 的内存地址。