`
xitong
  • 浏览: 6158913 次
文章分类
社区版块
存档分类
最新评论

[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函数

分享到:
评论

相关推荐

    内存管理内存管理内存管理

    程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 C 风格的内存分配程序 C 编程语言提供了两个函数来...

    操作系统(内存管理)

    因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一个...

    c++ 面试题 总结

    内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理 块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几...

    Go语言的缓存库FreeCache.zip

     cache.EntryCount())注意事项:推荐使用 Go 1.4 版本内存是预先分配的如果你分配的内存非常大,那么应该设置 debug.SetGCPercent() 到一个很小的比例来获得正常的 GC 频率FreeCache 通过减少指针的数量来避免 ...

    Go语言的方法接受者类型用值类型还是指针类型?

    很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下。 何时使用值类型 1.如果接受者是一个 map...

    golang基础.ppt

    整理golang语法基础: 数据类型 变量定义 控制结构 函数function 结构体struct 面向对象 接口interface 恐慌panic和恢复recover 并发goroutine和channel Import和package ...指针和内存分配(new和make)

    kafka-go:Go中的Kafka图书馆

    它还将所有值作为指针传递,这会导致大量动态内存分配,更频繁的垃圾回收和更高的内存使用率。 是围绕基于cgo的包装器,这意味着它将对使用该包的所有Go代码的C库引入依赖关系。 它具有比sarama更好的文档,但是...

    最新go语言中文教程及手册(强烈推荐)

    内存分配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 定义自己的类型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 ----------------------- ...

    Go 语言 值类型和引用类型的理解

    值类型:变量直接存储值,内存通常在栈中分配; var num = 100 如图所示: 二、引用类型: 引用类型包括,指针、slice切片、map、管道 chan、interface等; 引用类型:变量存储一个地址,地址对应的空间才真正存储...

    汉诺塔java源码-data-structures-algorithms:GoLang中数据结构和算法的实现

    的好语言,因为在编写代码时必须处理很多事情,例如内存分配和适当的释放,并且通过这样做可以学到很多东西。 然而,go 也是实现 DSA 的好语言的原因是它缺乏很多魔法。 没有运算符重载,因此无法隐藏额外的复杂性。...

    CheckMem.pas

    注意这里不是指对象变量或指针变量的地址,是对象的内存区域或指针指向的内存地址) 序号 未释放内存的地址 内存大小 是否是对象?如果是列出对象的Name及class并指出对象实现的单元文件名 0) 0000000000F33798...

    Go语言中new()和 make()的区别详解

    Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。 new 的主要特性 首先 new 是内建函数,你可以从 http://golang.org/pkg/builtin/#new 这儿看到它,它的...

    Go学习笔记(第四版).zip

    1.2 分配流程 117 5 Go 学习笔记, 第 4 版 1.3 释放流程 131 1.4 其他 135 2. Garbage Collector 140 2.1 初始化 140 2.2 垃圾回收 141 2.3 内存释放 155 2.4 状态输出 160 3. Goroutine Scheduler 166 3.1 初始化 ...

    Golang基础1

    引入包严格区分大小写垃圾回收机制管道通信机制相同new返回指针各种类型的内存分配子主题 2格式: map[keyType]valueTypelen函数返回map

    Go语言中的Array、Slice、Map和Set使用详解

    数组是很有价值的数据结构,因为它的内存分配是连续的,内存连续意味着可是让它在 CPU 缓存中待更久,所以迭代数组和移动元素都会非常迅速。 数组声明和初始化 通过指定数据类型和元素个数(数组长度)来声明数组。 ...

    golang源码分析–slice

    切片基础概念: 切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。(注意:切片传递的是指针的拷贝值,所以...所以传递一个切片切片需要24字节的内存:指针字段需要8字节,长度和容量字段分别需要8字节。 切片

    入门学习Linux常用必会60个命令实例详解doc/txt

    这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...

    go学习笔记

    1.2 分配流程 117 Go 学习笔记, 第 4 版 5 1.3 释放流程 131 1.4 其他 135 2. Garbage Collector 140 2.1 初始化 140 2.2 垃圾回收 141 2.3 内存释放 155 2.4 状态输出 160 3. Goroutine Scheduler 166 3.1 初始化 ...

    详解go中的引用类型

    引用类型拥有更复杂的存储结构:(1)分配内存 (2)初始化一系列属性等一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置,这个内存地址被称之为指针,这个指针实际上也被存在...

    copyfighter:静态分析Go代码并报告按值传递大型结构的函数

    如果在不使用指向大型结构的指针的情况下传递大型结构,则在内存中复制新数据将导致更多分配和更多垃圾回收工作。 Copyfighter的静态分析将确定没有指针的大型结构在哪里用作方法接收器,函数参数和返回值。 使用go...

Global site tag (gtag.js) - Google Analytics