# 指针
# 1. 概述
每一个变量都存放在内存中的某个位置,内存中的这些位置都有地址,存放这些地址的变量就是指针。
num := 12
p := &num
上面实例中,num
是一个数字,使用 &
符号取出 num
的地址, 存放到 p
的指针变量中, p
是 int
型变量。
fmt.Print(p)
// 0xc000014088
上面实例中,打印了 p
中存放的地址,每次运行时随机分配内存,所以每次结果不一样。
fmt.Print(*p) // 12
用 *
符号来获取地址指向的值。
当一个指针没有赋值时,值为 nil。
var p *int
p == nil // true
``
## 2. new
new 是一个函数,用于向内存申请空间。
值类型数据在声明时,会自动申请空间,引用类型则不会,比如指针、map等。
```go
var a *int
*a = 10 // 报错
上面实例中,初始化了一个 int 型指针,运行会报错,因为我们没有为 a
申请空间,使用 new 可以申请空间。
var p *int
p = new(int)
*p = 10 // 正确
new 方法会返回该类型的指针,参数是创建的类型。
# 3. make
make 也是申请空间的函数,不同于 new,它只用于 slice、map、chan 的内存创建,返回引用类型本身。
var myMap map[string]int
myMap = make(map[string]int, 10)
myMap["apple"] = 10
# 4. new 与 make 的区别
- 二者都是用来做内存分配的。
- make 只用于slice、map、channel 的初始化,返回引用类型的本身。
- new 用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。