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

Kevin501 等级 594 0 0

1. Go语言中的值类型和引用类型

  • 值类型:int,float,bool,string,struct数组 (数组要特别注意,别搞混了)

变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。

  • 引用类型:slice,map,chan和值类型对应的指针

变量存储的是一个地址(或者理解为指针),指针指向内存中真正存储数据的首地址。内存通常在堆上分配,通过GC回收。

2. new() vs make()

对值类型和引用类型了解之后,再来理解new()和make()就不难了,其实只要有C/C++背景的理解起来都不难。比如我们声明一个int类型的数据,一般是这样的:

var i int

var s string

当我们不指定变量的默认值时,这些变量的默认值就是对应的零值。(int类型的零值是0,string类型的零值是"",引用类型的零值是nil)。我们可以直接对值类型的变量进行赋值,修改变量对应的值等等。但是,如果声明的变量是引用类型呢?这就需要用到new()或make()函数了。先来看这样一个例子:

var i int // 值类型
i = 10 fmt.Println(i) // 10

var p \*int // 引用类型
\*p = 10 fmt.Println(\*p) //panic: runtime error: invalid memory address or nil pointer dereference

从例子可以看到,当对指针p进行赋值的时候,出现了panic,提示p 是无效的内存地址或是空指针引用。也就是说,对于引用类型的变量,我们不仅要声明变量(这仅仅是给变量取个名字),更重要的是,我们得手动为它分配空间!好在Go中还有GC,如果是C/C++,对于指针类型,除了手动申请空间,更要手动释放空间。

new()方法就是为 int/bool/struct等 值类型分配内存空间,返回相应类型的指针;而make()就是专为slice,map,channel分配空间。

new()

该方法的参数要求传入一个类型,而不是一个值,它会申请一个该类型大小的内存空间,并会初始化为对应的零值,返回指向该内存空间的一个指针。如下:

// The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that type.
func new(Type) \*Type

因此,我们可以稍稍修改上面错误的程序.

var p \*int // 引用类型,或者写成 p := new(int)
p = new(int) \*p = 10 fmt.Println(\*p) // 10 

make()

make也是用于内存分配,但是和new不同,它只用于slice、map和channel的内存创建,它返回的类型就是类型本身,而不是它们的指针类型。

// The make built-in function allocates and initializes an object of type // **slice, map, or chan (only)**. Like new, the first argument is a type, not a // value. Unlike new, make's return type is the same as the type of its // argument, not a pointer to it. The specification of the result depends on // the type: // Slice: The size specifies the length. The capacity of the slice is // equal to its length. A second integer argument may be provided to // specify a different capacity; it must be no smaller than the // length. For example, make(\[\]int, 0, 10) allocates an underlying array // of size 10 and returns a slice of length 0 and capacity 10 that is // backed by this underlying array. // Map: An empty map is allocated with enough space to hold the // specified number of elements. The size may be omitted, in which case // a small starting size is allocated. // Channel: The channel's buffer is initialized with the specified // buffer capacity. If zero, or the size is omitted, the channel is // unbuffered.
func make(t Type, size ...IntegerType) Type
收藏
评论区

相关推荐

[Go] GO语言中的md5和sha256加密
项目中经常使用的md5和sha256加密函数 //md5加密 func Md5(src string) string { m : md5.New() m.Write(byte(src)) res : hex.EncodeToString(m.Sum(nil)) return res } //Sha256加密
Go语言中new()和make()的区别
1. Go语言中的值类型和引用类型 值类型:int,float,bool,string,struct和数组 (数组要特别注意,别搞混了) 变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。 引用类型:slice,map,chan和值类型对应的指针 变量存储的是一个地址(或者理解为指针),指针指向内存中真
Go语言开发的利与弊
Go 语言有多火爆?国外如 Google、AWS、Cloudflare、CoreOS 等,国内如七牛、阿里等都已经开始大规模使用 Go 语言开发其云计算相关产品。在 Go 语言的使用过程中,需要注意哪些 Yes 和 But? 最近,我们使用 Go 语言编写了一个 API,Go 语言是一种开源编程语言,2009 年由 Google 推出。在使用 Go 进行开
知乎从Python转为Go,是不是代表Go比Python好?
众所周知,知乎早在几年前就将推荐系统从 Python 转为了 Go。于是乎,一部分人就说 Go 比 Python 好,Go 和 Python 两大社区的相关开发人员为此也争论过不少,似乎,谁也没完全说服谁。 知乎从Python转为Go,是不是代表Go比Python好?我认为,各有优点,谁也取代不了谁,会长期共存! “由 Python 语言转向 Go 语言
一篇文章彻底弄懂go语言方法的本质
Go 语言不支持经典的面向对象语法元素,比如:类、对象、继承等。但 Go 语言也有方法(method)。和函数相比,Go 语言中的方法在声明形式上仅仅多了一个参数,Go 称之为 receiver 参数。而 receiver 参数正是方法与类型之间的纽带。Go 方法的一般声明形式如下:gofunc (receiver T/T) MethodName(参数列表)
Go初识
Go初识 ---- 下载安装包:[https://golang.org/dl/](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgolang.org%2Fdl%2F) ### 什么是Go语言 * Go语言也称为 Golang,是由 Google 公司开发的一种静态强类型、编译型、
Go语言规范(介绍)
Google发布Go语言已经有一段时间了,但是还少有在论坛看到关于Go的讨论,几个Go语言的BBS也冷冷清清的,国内程序员对 Go语言 似乎还持观望态度。在看了它的一点特性和一段时间的试用之后,我感受到了 Go语言 给我带来的乐趣,个人觉得 Go语言 以后将会有很好的发展前景,我已经是等不及了,我要好好学习一下这门语言,当然还有对里面的大牛们产生的崇拜!^\
gh
gh-ost实战运用 ========== 一、安装步骤 ------ **1、环境** go版本:1.10.3 gh-ost版本:1.0.46 **2、安装go语言** # 安装go依赖包 yum install bison ed gawk gcc libc6-dev make -y #
Emacs for Go
In this post I'm going to explore customizing Emacs to make hacking on Go a little more fluid. This is a living document and will probably be updated as I discover new modes and to
Go 版本入 Dubbo 生态一周年:已和 Spring Cloud、gRPC 互通
本文作者:o\*\*\*\*0 去年5月,阿里开源的高性能 RPC 框架 Dubbo 从 ASF 毕业并晋升顶级项目,同时,还宣布 Go 语言版本的 Dubbo-go 正式加入 Dubbo 官方生态。 经过一年的发展, Dubbo-go 在技术和社区运营方面都已经有了不错的成绩。Dubbo-go 是 Dubbo 的完整 Go 语言实现,在功能实现和技术路
Golang代码测试:一点到面用测试驱动开发
> **摘要**:TDD(Test Driven Development),测试驱动开发。期望局部最优到全局最优,这个是一种非常不错的好习惯。 了解Golang的测试之前,我们先了解一下go语言自带的测试工具。 go test工具 --------- Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的
Golang查缺补漏(一)
### [Go语言高级编程(Advanced Go Programming)](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fbooks.studygolang.com%2Fadvanced-go-programming-book%2F) [Go语言高级编程(Advanced G
Go语言开发Windows应用
当第一次看到Go程序在windows平台生成可执行的exe文件,就宣告了windows应用也一定是Go语言的战场。Go不是脚本语言,但却有着脚本语言的轻便简单的特性。相较于php和python之类以服务器控制台为主要战场的脚本语言来说,Go语言是真正的圆了“动态语言的应用开发梦”。 Windows Api =========== Windows桌面应用依
Go语言,在Ubuntu9.10和Windows安装
工作环境:Ubuntu9.10 A、安装C语言工具 Go的工具链采用C语言编写,构建需要安装以下开发工具: GCC, C语言标准库, the parser generator Bison, make, awk, 和 ed (编辑器). 对于 OS X 系统,以上工具是Xcode的一部分。 对于 Ubuntu/Debian 系统,运
TiDB 点滴
TiDB Make时报错: package golang.org/x/text/encoding: unrecognized import path "golang.org/x/text/encoding" package golang.org/x/tools/go/gcimporter: unrecognized import path "golang