Golang 语言中的内置函数 make 和 new

简介: Golang 语言中的内置函数 make 和 new

介绍

Golang 语言中的内置函数 make 和 new 都是用作变量初始化,但是它们初始化变量的方式不同。关于它们之间的区别,我们可以简述为 make 返回类型是引用类型,new 返回类型是指针类型。本文我们首先分别介绍二者,然后再介绍二者的区别。

内置函数 make

关于内置函数 make,官方的介绍是 make 内置函数仅用作分配内存空间并初始化 slice,map 和 chan 类型的对象。与 new 相同,第一个参数是类型,而不是值。与 new 不同,make 的返回类型与其参数的类型相同,而不是指向它的指针。

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

返回值取决于传参的类型:

  • Slice
s := make([]T, 0, 10)
  • 以上示例代码表示分配一个长度为 10 的底层数组,返回一个长度为 0,容量为 10 的切片。
    使用内置函数 make 初始化 slice,第一个参数是类型,第二个参数是 slice 的长度,第三个参数是可选参数,它代表 slice 的容量,如果不传入第三个参数,slice 的容量与长度相同,但是如果传入第三个参数,它的值(容量)比如大于或等于传入的第二个参数(长度)。
  • Map
m := make(map[T]T)
  • 以上示例代码表示给 map 分配内存空间。
    使用内置函数 make 初始化 map,传入的参数是类型,map 没有容量限制,初始化时无需指定容量的大小。
  • Channel
c := make(chan T, 10)
  • 以上示例代码表示给 channel 分配的内存空间大小(缓冲容量)为 10。channel 的缓冲区使用指定的值初始化缓冲容量。如果为零或忽略大小(不传入第二个参数),则 channel 为无缓冲的。

03

内置函数 new

关于内置函数 new,官方介绍是内置函数 new 仅用作分配内存空间,第一个参数是类型,而不是值,返回值是指向新分配该类型的零值的指针。

func new(Type) *Type

在 Golang 开发中,通常不太常用内置函数 new,它的使用场景一般是需要显式返回指针。

04

make 和 new 的区别

在阅读完上述内容后,我相信读者朋友们应该已经了解了二者的区别。

  • make 仅用于初始化 slice,map 和 chan,new 可用于初始化任意类型。
  • make 返回值是”引用类型“,new 返回值是指针类型。

05

总结

本文我们介绍了内置函数 make 和 new,并且对比归纳了二者的区别,在 Golang 开发中,内置函数 make 是必用的,因为 slice,map 和 chan,必须使用内置函数 make 初始化,才可以使用;而内置函数 new 并不常用,通常使用场景是需要显式返回指针。

推荐阅读:

Golang 语言中的非类型安全指针

参考资料:

https://medium.com/learn-code/golang-new-vs-make-8a4dbd84e92b 

https://stackoverflow.com/questions/25358130/what-is-the-difference-between-new-and-make 

https://golang.org/ref/spec#Making_slices_maps_and_channels 

https://dave.cheney.net/2014/08/17/go-has-both-make-and-new-functions-what-gives 

https://stackoverflow.com/questions/9320862/why-would-i-make-or-new/9325620#9325620 

https://golang.org/pkg/builtin/#make 


目录
相关文章
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
139 1
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
612 4
Golang语言之管道channel快速入门篇
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
235 4
Golang语言文件操作快速入门篇
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
502 3
Golang语言之gRPC程序设计示例
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
284 4
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
259 4
Golang语言之Prometheus的日志模块使用案例
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
633 4
Golang语言goroutine协程篇
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
215 1
|
JSON Go 数据格式
Golang语言结构体链式编程与JSON序列化
这篇文章是关于Go语言中结构体链式编程与JSON序列化的教程,详细介绍了JSON格式的基本概念、结构体的序列化与反序列化、结构体标签的使用以及如何实现链式编程。
214 4
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
160 3