指针
Go 拥有指针。指针保存了值的内存地址。
类型*T
是指向T
类型值的指针。其零值为nil
。
var p *int
&
操作符会生成一个指向其操作数的指针。
i := 42
p = &i
*
操作符表示指针指向的底层值。
fmt.Println(*p) // 通过指针 p 读取 i
*p = 21 // 通过指针 p 设置 i
这也就是通常所说的“间接引用”或“重定向”。
与 C 不同,Go 没有指针运算
案例:
package main
import "fmt"
func main() {
i, j := 42, 2701
p := &i // 指向 i
fmt.Println(*p) // 通过指针读取 i 的值
*p = 21 // 通过指针设置 i 的值
fmt.Println(i) // 查看 i 的值
p = &j // 指向 j
*p = *p / 37 // 通过指针对 j 进行除法运算
fmt.Println(j) // 查看 j 的值
}
package main
import "fmt"
func swap(a *int, b *int) {
tmp := *a // “间接引用”或“重定向” 注意go没有指针运算
*a = *b
*b = tmp
return
}
func main() {
first := 100
second := 200
swap(&first, &second)
fmt.Println(first) // 200
fmt.Println(second) // 100
}
package main
import "fmt"
func swap(a *int, b *int) (int, int) {
tmp := a
a = b
b = tmp
return *a, *b
}
func main() {
first := 100
second := 200
a, b := swap(&first, &second) // 交换a,b值,地址copy
fmt.Println(a, b)
fmt.Println(first) // 100
fmt.Println(second) // 200
}
有疑问加站长微信联系(非本文作者)