Go 中的函数指针
Go语言中的指针是一种具有特殊用途的变量,用于存储其他变量的内存地址和内存所在的点。 也可以访问存储在该内存位置的值。
Go 中的指针声明
var pointer_name *Data_Type
函数指针中使用的运算符
-
-
- 它是一个声明指针变量的取消引用运算符。 可以使用它访问存储在解除引用地址中的值。
-
- & - 这是一个地址运算符,用于给出变量的地址。
在 Go 中初始化一个指针
package main
import "fmt"
func main() {
var myVariable int = 2
var myPointer *int
myPointer = &myVariable
fmt.Println("The value stored in 'myVariable' = ", myVariable)
fmt.Println("The address of 'myVariable' = ", &myVariable)
fmt.Println("The value stored in 'myPointer' = ", myPointer)
fmt.Println("The value pointed by 'myPointer' after dereferencing = ", *myPointer)
}
输出:
The value stored in 'myVariable' = 2
The address of 'myVariable' = 0xc000090020
The value stored in 'myPointer' = 0xc000090020.
The value pointed by 'myPointer' after dereferencing = 2
注意myPointer变量中存储的值是变量myVariable的地址。
在 Go 中使用未初始化的指针
package main
import "fmt"
func main() {
var myPointer *int
fmt.Println("The value stored in 'myPointer' = ", myPointer)
}
输出:
The value stored in 'myPointer' = <nil>
请注意
,未初始化的指针将具有默认的 nil 值。
在 Go 中对指针使用简写 :=
语法
package main
import "fmt"
func main() {
myVariable := 2
myPointer := &myVariable
fmt.Println("The value stored in 'myVariable' = ", myVariable)
fmt.Println("The address of 'myVariable' = ", &myVariable)
fmt.Println("The value stored in 'myPointer' = ", myPointer)
fmt.Println("The value pointed by 'myPointer' after dereferencing = ", *myPointer)
}
输出:
The value stored in 'myVariable' = 2
The address of 'myVariable' = 0xc000090020
The value stored in 'myPointer' = 0xc000090020
The value pointed by 'myPointer' after dereferencing = 2
请注意
,如果您已使用指针声明指定数据类型,则您只能使用指针来处理该指定数据类型变量的内存地址。
:=
运算符自动识别数据类型并确保创建的指针可以处理相同的数据类型。
在 Go 中使用指针更改变量的值
package main
import "fmt"
func main() {
myVariable := 2
myPointer := &myVariable
fmt.Println("The value stored in 'myVariable' = ", myVariable)
fmt.Println("The address of 'myVariable' = ", &myVariable)
fmt.Println("The value stored in 'myPointer' = ", myPointer)
fmt.Println("The value pointed by 'myPointer' after dereferencing = ", *myPointer)
*myPointer = 5
fmt.Println("The updated value pointed by 'myPointer' after dereferencing = ", *myPointer)
fmt.Println("The updated value stored in 'myVariable' = ", myVariable)
}
输出:
The value stored in 'myVariable' = 2
The address of 'myVariable' = 0xc000016058
The value stored in 'myPointer' = 0xc000016058
The value pointed by 'myPointer' after dereferencing = 2
The updated value pointed by 'myPointer' after dereferencing = 5
The updated value stored in 'myVariable' = 5
请注意,您可以更改指针的值而不是为变量分配新值。 使用指针更改的值也反映在原始值中。
在 Go 中使用 new() 函数创建指针
package main
import "fmt"
func main() {
var myPointer = new(int)
*myPointer = 2
fmt.Println("The value stored in 'myPointer' = ", myPointer)
fmt.Println("The value pointed by 'myPointer' after dereferencing = ", *myPointer)
}
输出:
The value stored in 'myPointer' = 0xc000016058
The value pointed by 'myPointer' after dereferencing = 2
请注意
,使用new()
函数,您可以直接创建一个指向整数的指针。
将指针作为参数传递给 Go 中的函数
package main
import "fmt"
func myFunction(myVariable *int) {
*myVariable = 5
}
func main() {
var myVariable = 2
fmt.Printf("The value of myVariable before function call is: %d\n", myVariable)
var myPointer *int = &myVariable
myFunction(myPointer)
fmt.Printf("The value of myVariable after function call is: %d\n", myVariable)
}
输出:
The value of myVariable before function call is: 2
The value of myVariable after function call is: 5
请注意,上面创建的函数更改了变量 myVariable 的值。 函数中改变的值反映在函数外,因为指针直接引用变量存储的内存位置。
将变量的地址作为参数传递给 Go 中的函数
package main
import "fmt"
func myFunction(myVariable *int) {
*myVariable = 5
}
func main() {
var myVariable = 2
fmt.Printf("The value of myVariable before function call is: %d\n", myVariable)
myFunction(&myVariable)
fmt.Printf("The value of myVariable after function call is: %d\n", myVariable)
}
输出:
The value of myVariable before function call is: 2
The value of myVariable after function call is: 5
请注意
,上面创建的函数更改了变量 myVariable 的值。 函数中更改的值反映在函数外部。
更改是对存储变量的内存位置进行的。 这是将指针传递给函数的另一种方法。
从 Go 中的函数返回指针
package main
import "fmt"
func main() {
displayText := display()
fmt.Println("Hello,", *displayText)
}
func display() *string {
myMessage := "World!"
return &myMessage
}
输出:
Hello, World!
请注意
,上面创建的函数将返回一个指向字符串 myMessage 的指针。 然后在主函数中取消引用该值。
相关文章
在 Golang 中使用 If-Else 和 Switch Loop Inside HTML 模板
发布时间:2023/04/27 浏览次数:65 分类:Go
-
本篇文章介绍了在 Golang 的 HTML 模板中使用 if-else 和 switch 循环。因此,只要输出是 HTML,就应该始终使用 HTML 模板包而不是文本模板。
Golang 中的零值 Nil
发布时间:2023/04/27 浏览次数:166 分类:Go
-
本篇文章介绍 nil 在 Golang 中的含义,nil 是 Go 编程语言中的零值,是众所周知且重要的预定义标识符。
Golang 中的 Lambda 表达式
发布时间:2023/04/27 浏览次数:93 分类:Go
-
本篇文章介绍如何在 Golang 中创建 lambda 表达式。Lambda 表达式似乎不存在于 Golang 中。 函数文字、lambda 函数或闭包是匿名函数的另一个名称。
在 Go 中捕获 Panics
发布时间:2023/04/27 浏览次数:66 分类:Go
-
像错误一样,Panic 发生在运行时。 换句话说,当您的 Go 程序中出现意外情况导致执行终止时,就会发生 Panics。让我们看一些例子来捕捉 Golang 中的Panics。
在 Go 中使用断言
发布时间:2023/04/27 浏览次数:181 分类:Go
-
本篇文章介绍了 assert 在 GoLang 中的使用。在 Go 语言中使用断言:GoLang 不提供对断言的任何内置支持,但我们可以使用来自 Testify API 的广泛使用的第三方包断言。
Go 中的随机数生成
发布时间:2023/04/27 浏览次数:114 分类:Go
-
本篇文章介绍如何在 Go 语言中使用随机数生成功能。Go 中的随机数生成 Go 语言为随机数生成功能提供内置支持。 内置包 math 有方法 rand(),用于随机数生成。