Golang 内置函数 new 和 make 的区别

简介: Go 语言中 new 和 make 都是内置函数,用于内存的分配,本文主要简述两者使用上的异同与特性。

Go 语言中 new 和 make 都是内置函数,用于内存的分配,本文主要简述两者使用上的异同与特性。


new



举个例子:

func main() {
  var i *int
  *i = 1
  fmt.Println(*i)
}


上面的程序并不会打印1,而会抛 panic 异常,因为i是一个引用类型,需要给它分配内存空间,通俗来说就是指针(内存地址)需要指向一片内存空间才有意义。


为 i 分配内存:

func main() {
  var i *int
  i = new(int)
  *i = 1
  fmt.Println(*i)
}


用 new 内置函数为 i 分配内存空间,并返回该内存空间的地址,即指针,new 函数格式如下:

func new(Type) *Type


可知,new 为每个类型分配一片内存空间,初始化为 0 并返回该内存空间的地址。

new 的内存分配示意图:

640.jpg



其实要说明一点的就是,new 不常用,我们常常会通过结构体的字面量达到 new 的效果,而且这样写也比较优雅:

man := &People{Name: "zhangchenghui", Age: 18, Sex: "男"}


make



make 也是分配内存分配,但是仅限 chan、map、slice 的内存创建,并返回其类型的引用,这一点很重要, chan、map、slice 其本身已经是引用类型了,所以make不需要再返回其指针,引用类型的本质就是指针!例如:


type i *int;


如上,i 就是一个自定义的引用类型,其类型是一个 int 类型的指针。

Make 内置函数格式:

func make(t Type, size ...IntegerType) Type


make 的内存分配示意图:

640.jpg


相关文章
|
6月前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
135 3
Golang语言之函数(func)进阶篇
|
6月前
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
148 2
Golang语言之函数(func)基础篇
|
10月前
|
Go
golang中置new()函数和make()函数的区别
golang中置new()函数和make()函数的区别
|
6月前
|
Unix Go
Golang语言标准库time之日期和时间相关函数
这篇文章是关于Go语言日期和时间处理的文章,介绍了如何使用Go标准库中的time包来处理日期和时间。
133 3
|
10月前
|
Go
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
【4月更文挑战第21天】Go语言函数是代码组织的基本单元,用于封装可重用逻辑。本文介绍了函数定义(包括基本形式、命名、参数列表和多返回值)、调用以及匿名函数与闭包。在函数定义时,注意参数命名和注释,避免参数顺序混淆。在调用时,要检查并处理多返回值中的错误。理解闭包原理,小心处理外部变量引用,以提升代码质量和可维护性。通过实践和示例,能更好地掌握Go语言函数。
260 1
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
|
6月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
194 4
Golang语言之管道channel快速入门篇
|
6月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
94 4
Golang语言文件操作快速入门篇
|
6月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
163 3
Golang语言之gRPC程序设计示例
|
6月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
123 4
|
6月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
76 3