指针指针
Go 拥有指针。指针保存了值的内存地址。code
类型*T
是指向T
类型值的指针。其零值为nil
。内存
var p *intimport
&
操做符会生成一个指向其操做数的指针。引用
i := 42
p = &iim
*
操做符表示指针指向的底层值。重定向
fmt.Println(*p) // 经过指针 p 读取 i
*p = 21 // 经过指针 p 设置 icopy
这也就是一般所说的“间接引用”或“重定向”。co
与 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 }