Go指针教程展示了如何在Golang语言中使用指针。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
指针保存一个值的内存地址。指针的零值是nil。与C语言不同,Go没有指针运算。
当我们复制大型结构或当我们想在不同的函数中修改数据时,指针很有用。
var pv *int = &mysum
*int是一个指向整数值的指针。&用于获取变量的地址(指针)。
fmt.Println(*pv)
*字符用于取消引用指针——它返回指针引用的值。
Go指针示例
下面是一个简单的Go指针示例。
package main
import "fmt"
func main() {
var count int = 4
fmt.Println(count)
var pv = &count
*pv = 3
fmt.Println(pv)
fmt.Println(*pv)
var pv2 *int = &count
*pv = 2
fmt.Println(pv2)
fmt.Println(*pv2)
pv3 := &count
*pv = 1
fmt.Println(pv3)
fmt.Println(*pv3)
}
我们定义了一个count整型变量。我们使用三种不同的形式创建了三个指向变量的指针。
var count int = 4
我们创建了count变量。
var pv = &count
我们创建一个指向count变量的指针。
*pv = 3
通过指针解引用,我们修改了count的值。
fmt.Println(pv) fmt.Println(*pv)
我们打印pv指针的地址和值。
$ go run simple.go 4 0xc0000140f8 3 0xc0000140f8 2 0xc0000140f8 1
去指针修改
指针可用于修改其定义函数之外的变量。
package main
import "fmt"
func modify(pv *int) {
*pv = 11
}
func main() {
var count int = 10
fmt.Println(count)
modify(&count)
fmt.Println(count)
}
在main函数中,我们定义了count变量。modify函数接受一个指针作为参数。我们可以用它来修改main函数之外的count变量。默认情况下,Go中的函数按值传递变量。
$ go run modify.go 10 11
指向结构体的指针
指针通常与Go中的结构一起使用。
package main
import "fmt"
type User struct {
name string
occupation string
}
func modify(pu *User) {
pu.name = "Robert Roe"
pu.occupation = "driver"
}
func main() {
u := User{"John Doe", "gardener"}
fmt.Println(u)
modify(&u)
fmt.Println(u)
}
我们有一个User结构。我们通过指针更改modify函数内部的结构。
pu.name = "Robert Roe"
pu.name与(*pu).name相同。
$ go run pstruct.go
{John Doe gardener}
{Robert Roe driver}
带新关键字的指针
new关键字将类型作为参数,分配足够的内存以适应该类型的值并返回指向它的指针。
package main
import (
"fmt"
"reflect"
)
type User struct {
name string
occupation string
}
func main() {
var pu *User = new(User)
fmt.Println(pu)
fmt.Println(reflect.TypeOf(pu))
pu.name = "Robert Roe"
pu.occupation = "accountant"
fmt.Println(pu)
}
在代码示例中,我们使用new关键字创建了一个用户。
$ go run newkey.go
&{ }
*main.User
&{Robert Roe accountant}
将指针指向指针
一个指针可以指向另一个指针。要取消引用此类指针的值,我们使用**字符。
package main
import "fmt"
func main() {
var a = 7
var p = &a
var pp = &p
fmt.Println(a)
fmt.Println(&a)
fmt.Println("--------------------")
fmt.Println(p)
fmt.Println(&p)
fmt.Println("--------------------")
fmt.Println(pp)
fmt.Println(&pp)
fmt.Println("--------------------")
fmt.Println(*pp)
fmt.Println(**pp)
}
该示例创建一个指向另一个指针p的指针pp。
$ go run pointer2pointer.go 7 0xc0000140f8 -------------------- 0xc0000140f8 0xc00000e028 -------------------- 0xc00000e028 0xc00000e030 -------------------- 0xc0000140f8 7
在本教程中,我们介绍了Go指针。
列出所有Go教程。
