浅析Golang中make和new的用法区别

 更新时间:2024年02月03日 08:10:27   作者:梦_鱼  
在Go语言中,有两个比较雷同的内置函数,分别是new和make方法,二者都可以用来分配内存,那他们有什么区别呢?下面就跟随小编一起来学习一下吧

相同点

都是内建函数,都是在堆上分配内存,都需要传递类型参数

不同点

1.传递的参数不一样

new函数只接收一个参数,make函数可以接收一个以上的参数

package main

import "fmt"

func main() {
	// int类型0值的指针,返回的值是以0x开头的16进制整数,参数个数为1
	intZeroValuePoint := new(int)
	fmt.Printf("%v\n", intZeroValuePoint)

	// 为slice分配内存, 创建初始值问 [0 0 0 0 0] 的切片,参数个数为3,第三个参数是可选的
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%v\n", intHasInitLenSlice)
}

2.返回的参数类型不一样

new函数返回对应输入参数类型的指针类型,make函数返回输入参数类型

package main

import "fmt"

func main() {
	// int类型0值的指针,返回的值是以0x开头的16进制整数
	intZeroValuePoint := new(int)
	fmt.Printf("%T\n", intZeroValuePoint)		// 输出 *int

	// 为slice分配内存, 创建初始值问 [0 0 0 0 0] 的切片
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%T\n", intHasInitLenSlice)		// 输出 []int
}

3.使用场景不一样

new函数为类型分配类型对应零值内存并返回指针,make是为特定引用类型slice map chan 分配内存

package main

import "fmt"

func main() {
	// int类型0值的指针,返回的值是以0x开头的16进制整数
	intZeroValuePoint := new(int)
	fmt.Printf("%T\n", intZeroValuePoint) // 输出 *int

	// 为slice零值分配内存,返回的值是以0x开头的16进制整数
	sliceZeroValuePoint := new([]int)
	fmt.Printf("%T: %v\n", sliceZeroValuePoint, sliceZeroValuePoint) // 输出 *[]int &[]

	// 为slice分配内存, 创建初始值问 [0 0 0 0 0] 的切片
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%T\n", intHasInitLenSlice) // 输出 []int

	// 为map分配内存
	mapValue := make(map[string]string, 10)
	fmt.Printf("%T\n", mapValue) // 输出 map[string]string

	// 为chan类型分配内存
	chanValue := make(chan int, 10)
	fmt.Printf("%T\n", chanValue)
}

总结

下面小编为大家总结了一下new和make函数的异同点,希望对大家有所帮助

相同点

  • 都是内建函数,用于内存管理。
  • 都涉及到动态内存的分配。

不同点

用途和适用类型:

  • new(T):适用于任何类型的内存分配,包括但不限于结构体、数组、指针等。它会为指定的类型 T 分配内存,并将内存初始化为其零值,然后返回指向该内存区域的指针(类型为 *T)。
  • make(T, args…):仅适用于三个内建的引用类型,即切片(slice)、映射(map)和通道(channel)。对于这三种类型,make 不仅仅是分配内存,还会执行额外的初始化操作,如设置内部数据结构、哈希表大小以及 channel 缓冲区等。make 函数的返回值直接是初始化后的 slice/map/channel 类型,而不是指针。

使用方式和返回值:

  • new() 的调用形式相对简单:p := new(Type),返回的是一个指向新分配内存的指针。
  • make() 的调用需要提供额外参数以初始化相应的类型,例如创建切片时需要长度和可选的容量:s := make([]int, length, capacity);创建 map 或 channel 时无需指定大小,但可以对通道指定缓冲区大小。

初始化内容:

new() 只做最基本的内存分配并填充零值。

make() 初始化的内容更复杂,例如:

  • 对于切片,会创建底层数组并设置长度和容量;
  • 对于映射,会初始化一个空的哈希表;
  • 对于通道,会创建一个通信的数据结构,并可选择性地分配缓冲区。

到此这篇关于浅析Golang中make和new的用法区别的文章就介绍到这了,更多相关Go make new区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Go语言实现读取本地文本文件内容

    使用Go语言实现读取本地文本文件内容

    这篇文章主要为大家详细介绍了如何使用Go语言实现读取本地文本文件内容功能,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
    2025-07-07
  • 浅析Go语言容器之数组和切片的使用

    浅析Go语言容器之数组和切片的使用

    在 Java 的核心库中,集合框架可谓鼎鼎大名:Array 、List、Set等等,随便拎一个出来都值得开发者好好学习如何使用甚至是背后的设计源码。虽然Go语言没有如此丰富的容器类型,但也有一些基本的容器供开发者使用,接下来让我们认识一下这些容器类型吧
    2022-11-11
  • 简单聊一聊Go语言中的数组和切片

    简单聊一聊Go语言中的数组和切片

    数组和切片由于语法十分相似,在使用中容易混淆,要认真区分,下面这篇文章主要给大家介绍了关于Go语言中数组和切片的相关资料,需要的朋友可以参考下
    2021-07-07
  • 浅谈golang中的&^位清空操作

    浅谈golang中的&^位清空操作

    这篇文章主要介绍了浅谈golang中的&^位清空操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 详解Golang ProtoBuf的基本语法总结

    详解Golang ProtoBuf的基本语法总结

    最近项目是采用微服务架构开发的,各服务之间通过gPRC调用,基于ProtoBuf序列化协议进行数据通信,因此接触学习了Protobuf,本文会对Protobuf的语法做下总结,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
    2022-10-10
  • go-spew调试利器详解

    go-spew调试利器详解

    这篇文章主要介绍了调试利器 go-spew,go-spew 可以以一种非常友好的方式输出完整的数据结构信息,go-spew 支持一些自定义配置,可以通过 spew.Config 修改,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Golang 实现复制文件夹同时复制文件

    Golang 实现复制文件夹同时复制文件

    这篇文章主要介绍了Golang 实现复制文件夹同时复制文件,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 浅析Go语言中的map数据结构是如何实现的

    浅析Go语言中的map数据结构是如何实现的

    在 Go 中,map 是一种用于存储键值对的数据结构,它提供了一种快速查找和访问数据的方式,下面我们就来看看Go语言中是如何实现map数据结构的吧
    2024-03-03
  • golang图片处理库image基本操作

    golang图片处理库image基本操作

    这篇文章主要介绍了golang图片处理库image简介,主要包括图片的基本读取与保存及图片的修改,本文通过通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 利用Go语言实现流量回放工具的示例代码

    利用Go语言实现流量回放工具的示例代码

    今天给大家推荐一款使用Go语言编写的流量回放工具 -- goreplay;工作中你一定遇到过需要在服务器上抓包的场景,有了这个工具就可以助你一臂之力,废话不多,我们接下来来看一看这个工具
    2022-09-09

最新评论