1.指针
区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。
1.1 定义
指针是一个变量,存储的是另一个变量的内存地址。
Go语言中的指针操作非常简单,只需要记住两个符号:&
(取地址)和*
(根据地址取值)。
1.2 声明指针
var p *int //声明一个指向 int 类型的指针
1.3 指针取值
在对普通变量使用 & 操作符取地址后会获得这个变量的指针,然后可以对指针使用 *
操作,也就是指针取值,代码如下。
a := 1
b := &a // 取变量a的地址,将指针保存到b中
fmt.Printf("type of b:%T\n", b) //type of b:*int
c := *b // 指针取值(根据指针去内存取值)
fmt.Printf("type of c:%T\n", c) //type of c:int
fmt.Printf("value of c:%v\n", c) //value of c:1
1.4 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
尝试解引用 nil
指针会导致运行时 panic。
var p *int
if p == nil {
fmt.Println("p is nil")
}
// fmt.Println(*p) // 运行时 panic: nil pointer dereference
1.5 new和make
Go语言中对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们无法赋值。而对于值类型的声明不需要分配内存空间,是因为它们在声明的时候已经默认分配好了内存空间。要分配内存,就引出来今天的new和make。 Go语言中new和make是内建的两个函数,主要用来分配内存。
1.51 new
(1)定义
- new 是一个内置函数,用于为任意类型分配内存。
- 它返回指向该类型零值的指针。
(2)语法
new(Type)
Type
:要分配内存的类型。- 返回值是一个指向
Type
类型零值的指针(*Type
)。
1.52 make
(1)定义
make
是一个内置函数,用于初始化某些特定类型的值。- 它只适用于以下三种类型:
- 切片(
slice
) - 映射(
map
) - 通道(
channel
)
- 切片(
(2)语法
make(Type, size)
Type
:要初始化的类型(必须是切片、映射或通道)。size
:可选参数,表示初始大小或容量(对于切片和映射有效)。
new与make的区别
1.二者都是用来做内存分配的。
2.make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
3.而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。