[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语言中有两个分配内存的机制,分别是内建的函数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 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 通过上面的例子得出,在为切片、mapchannel这三种类型分配内存时,为了不必要的使问题复杂化,应该使用Go的内建make函数

 

本文来自:CSDN博客

感谢作者:qiurisuixiang

查看原文:[Go] --- 指针和内存分配

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。