V
Vel·ToolKit
简洁 · 高效 · 即开即用
ZH
第 9 章 / 共 20 章

指针

& 与 *、何时用指针

取地址与解引用

package main

import "fmt"

func main() {
    n := 42
    p := &n         // p 是 *int
    fmt.Println(*p) // 42
    *p = 100
    fmt.Println(n) // 100
}

传值 vs 传指针

Go 所有函数参数都是值传递。想让函数修改调用者变量,传指针;想让大结构体不被拷贝,也传指针。

package main

import "fmt"

func grow(s *string) {
    *s += "!"
}

func main() {
    name := "go"
    grow(&name)
    fmt.Println(name) // go!
}

new 与零值指针

new(T) 返回一个指向类型 T 零值的指针,等价于 &T{}。实际很少用。

package main

import "fmt"

func main() {
    p := new(int)
    *p = 5
    fmt.Println(*p)
}

没有指针运算

Go 不支持 p++ 之类的指针算术;想批量访问内存请用切片。