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函数
分享到:
相关推荐
程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 C 风格的内存分配程序 C 编程语言提供了两个函数来...
因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一个...
内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理 块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几...
cache.EntryCount())注意事项:推荐使用 Go 1.4 版本内存是预先分配的如果你分配的内存非常大,那么应该设置 debug.SetGCPercent() 到一个很小的比例来获得正常的 GC 频率FreeCache 通过减少指针的数量来避免 ...
很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下。 何时使用值类型 1.如果接受者是一个 map...
整理golang语法基础: 数据类型 变量定义 控制结构 函数function 结构体struct 面向对象 接口interface 恐慌panic和恢复recover 并发goroutine和channel Import和package ...指针和内存分配(new和make)
它还将所有值作为指针传递,这会导致大量动态内存分配,更频繁的垃圾回收和更高的内存使用率。 是围绕基于cgo的包装器,这意味着它将对使用该包的所有Go代码的C库引入依赖关系。 它具有比sarama更好的文档,但是...
内存分配. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 定义自己的类型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 ----------------------- ...
值类型:变量直接存储值,内存通常在栈中分配; var num = 100 如图所示: 二、引用类型: 引用类型包括,指针、slice切片、map、管道 chan、interface等; 引用类型:变量存储一个地址,地址对应的空间才真正存储...
的好语言,因为在编写代码时必须处理很多事情,例如内存分配和适当的释放,并且通过这样做可以学到很多东西。 然而,go 也是实现 DSA 的好语言的原因是它缺乏很多魔法。 没有运算符重载,因此无法隐藏额外的复杂性。...
注意这里不是指对象变量或指针变量的地址,是对象的内存区域或指针指向的内存地址) 序号 未释放内存的地址 内存大小 是否是对象?如果是列出对象的Name及class并指出对象实现的单元文件名 0) 0000000000F33798...
Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。 new 的主要特性 首先 new 是内建函数,你可以从 http://golang.org/pkg/builtin/#new 这儿看到它,它的...
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 初始化 ...
引入包严格区分大小写垃圾回收机制管道通信机制相同new返回指针各种类型的内存分配子主题 2格式: map[keyType]valueTypelen函数返回map
数组是很有价值的数据结构,因为它的内存分配是连续的,内存连续意味着可是让它在 CPU 缓存中待更久,所以迭代数组和移动元素都会非常迅速。 数组声明和初始化 通过指定数据类型和元素个数(数组长度)来声明数组。 ...
切片基础概念: 切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。(注意:切片传递的是指针的拷贝值,所以...所以传递一个切片切片需要24字节的内存:指针字段需要8字节,长度和容量字段分别需要8字节。 切片
这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...
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 初始化 ...
引用类型拥有更复杂的存储结构:(1)分配内存 (2)初始化一系列属性等一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置,这个内存地址被称之为指针,这个指针实际上也被存在...
如果在不使用指向大型结构的指针的情况下传递大型结构,则在内存中复制新数据将导致更多分配和更多垃圾回收工作。 Copyfighter的静态分析将确定没有指针的大型结构在哪里用作方法接收器,函数参数和返回值。 使用go...