[Go] --- 指针和内存分配

来源:互联网 发布:衣柜 知乎 编辑:程序博客网 时间:2024/04/30 22:22

Email : hahayacoder@gmail.com

 

1 Go语言中的指针和C语言中在使用上几乎没有什么差别,熟悉C语言应该很容易掌握,下面是Go语言中使用指针的代码

package mainimport "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 = 222fmt.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语言中有两个分配内存的机制,分别是内建的函数newmake。但是newmake并不能等同,他们所做的事情其实并不同,所应用到的类型也不相同,应用场景也不相同,但是在区分在何时使用newmake却有一个简单的规则
 
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)仅用于创建切片、mapchannel(消息管道)make(T, args)返回类型T的一个被初始化了的实例。而newT)返回指向类型T的零值指针。也就是说new函数返回的是*T的未初始化零值指针,而make函数返回的是T的初始化了的实例
 
5 Go语言中出现newmake两个分配内存的函数,并且使用起来还有差异,主要原因是切片、mapchannel这三种类型在使用前必须初始化相关的数据结构。例如,切片是一个有三项内容的数据类型,包括指向数据的指针(在一个数组内部进行切片)、长度和容量,在这三项内容被初始化之前,切片值为nil。换句话说:对于切片、mapchannelmake(T, args)初始化了其内部的数据结构并为他们准备了将要使用的值
例如:make([]int, 10, 100); //分配一个整形数组,长度为10,容量为100,并返回其前10个数组的切片
 
6 下面通过一个简单的例子来说明Go语言中new函数和make函数的差别
package mainimport "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 通过上面的例子得出,在为切片、mapchannel这三种类型分配内存时,为了不必要的使问题复杂化,应该使用Go的内建make函数

 

原创粉丝点击