指针
Go语言中的指针不能进行偏移和运算,没有内存泄漏的风险。
&
:取地址操作符,取出变量的地址*
:取值操作符,取出指针指向的值
b := &a
:这里的b
是指针变量,保存变量a
的地址,且*b == a
。
指针变量是引用类型的变量,声明时不会默认分配内存空间(值类型的变量在声明时会默认分配内存空间),需要使用内建函数来分配。
如果只声明就直接赋值,会引发panic
。
new
new
是一个内建函数,用于值类型的内存分配。使用方法如下:
a := new(Type)
Type
表示类型,new
函数返回*Type
类型的指针,指向的值对应类型的零值。
a := new(int)
fmt.Printf("%T\n", a) // *int
fmt.Println(*a) // 0
*a = 1
fmt.Println(*a) // 1
make
make
用于slice
、map
以及chan
这三个引用类型的初始化,其返回的类型就是这三个类型本身,而不是他们的指针类型。
slice
:make([]T, len, cap)
,T
表示元素类型;len
表示切片长度,每个元素初始化为对应类型的零值;cap
表示容量,默认等于长度,其值必须大于等于长度。map
:make(map[T1]T2, size)
,第一个参数是类型;size
表示初始化分配内存的大小,可忽略,忽略时会分配一个小一点的内存。可以估算好程序运行期间需要的内存大小,避免不停的动态扩容。初始化后的长度是0。channel
:make(chan T, cap)
,第一个参数是类型;cap
表示容量,默认是0。