[Go] --- 指针和内存分配
Email : hahayacoder@gmail.com
1 Go语言中的指针和C语言中在使用上几乎没有什么差别,熟悉C语言应该很容易掌握,下面是Go语言中使用指针的代码
package main import "fmt" func main() { var value int = 1 //指向int型的指针 var pInt *int = &value //打印相关信息 fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", value, pInt, *pInt) //通过指针修改指针指向的值 *pInt = 222 fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", value, pInt, *pInt) //使指针指向别的地址 var m int = 123 pInt = &m fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", value, pInt, *pInt) }
2 Go语言中有两个分配内存的机制,分别是内建的函数new和make。但是new和make并不能等同,他们所做的事情其实并不同,所应用到的类型也不相同,应用场景也不相同,但是在区分在何时使用new和make却有一个简单的规则
3 new(T)函数是一个分配内存的内建函数,但是不同于其他语言中内建new函数所做的工作,在Go语言中,new只是将内存清零,并没有初始化内存。所以在Go语言中,new(T)所做的工作是为T类型分配了值为零的内存空间并返回其地址,即返回*T。也就是说,new(T)返回一个指向新分配的类型T的零值指针
即:var pInt *int = new(int) //*pInt = nil
4 make(T, args)函数与new(T)函数的目的不同。make(T, args)仅用于创建切片、map和channel(消息管道),make(T, args)返回类型T的一个被初始化了的实例。而new(T)返回指向类型T的零值指针。也就是说new函数返回的是*T的未初始化零值指针,而make函数返回的是T的初始化了的实例
5 Go语言中出现new和make两个分配内存的函数,并且使用起来还有差异,主要原因是切片、map、channel这三种类型在使用前必须初始化相关的数据结构。例如,切片是一个有三项内容的数据类型,包括指向数据的指针(在一个数组内部进行切片)、长度和容量,在这三项内容被初始化之前,切片值为nil。换句话说:对于切片、map、channel,make(T, args)初始化了其内部的数据结构并为他们准备了将要使用的值
例如:make([]int, 10, 100); //分配一个整形数组,长度为10,容量为100,并返回其前10个数组的切片
6 下面通过一个简单的例子来说明Go语言中new函数和make函数的差别
package main import "fmt" func main() { //使用new为切片分配内存 但是返回的是零值指针 //接着还是用使用make初始化 不必要的使问题复杂化 所以几乎不这样使用 var p *[]int = new([]int) //*p = nil fmt.Println(p) //输出&[] fmt.Println(*p) //输出[] //使用make为切片分配内存 在为切片分配内存时一般使用这种方法 var v []int = make([]int, 10) fmt.Println(v) //输出[0 0 0 0 0 0 0 0 0 0 0] }
7 通过上面的例子得出,在为切片、map、channel这三种类型分配内存时,为了不必要的使问题复杂化,应该使用Go的内建make函数
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。