golang中make和new的区别

参考链接
https://worktile.com/kb/ask/38441.html

在Go语言中,make和new都是用于创建数据结构的内置函数,区别:

分配内存的区别

返回类型的区别

初始化的区别

分配内存的区别

  • make 用于创建切片、映射和通道引用类型 的数据结构。
  • new 用于创建结构体、数组和基本数据类型值类型 的数据结构。

返回类型的区别

  • make的返回类型与其参数的类型相同 ,而不是指向它的指针,因为这三种数据类型本身就是引用类型。(make 函数的返回值是引用类型的零值,通常是一个指向底层数据结构的指针。)
  • new返回的是指向类型的指针

简单理解就是:new返回指针,而make返回的是类型。

new的语法是:func new(Type) *Type

而make的语法为:func make(t Type, size ...IntegerType) Type

初始化的区别

make和new都是golang用来分配内存的內建函数,且在 堆上分配内存 。但不同的是,new分配空间后,是将内存清零,并没有初始化内存;而make分配空间后,是初始化内存,而不是清零。

  • make 函数返回的是已经初始化的数据结构,例如,make(\[\]int, 0)会创建一个空的整型切片,make(mapstringint)会创建一个空的字符串到整数的映射。
  • new 函数分配的内存空间是零值化的,即分配的内存会被初始化为零值


如果new 切片会怎么样

go 复制代码
package main

import (
	"fmt"
)

func main() {
	slice := new([]int)

	fmt.Printf("切片的类型:%T\n", slice)
	fmt.Printf("切片的值:%v\n", slice)
	fmt.Printf("切片的长度:%d\n", len(*slice))
	fmt.Printf("切片是否为 nil:%t\n", slice == nil)
}

结果:

go 复制代码
切片的类型:*[]int
切片的值:&[]
切片的长度:0
切片是否为 nil:false

使用 new 关键字创建的切片 slice 的值是一个 指向空切片的指针 &\[\],切片的长度为 0,但它并不是 nil,因为它指向了一个真实的切片对象。

==========

对比使用make创建切片的效果

go 复制代码
package main

import (
	"fmt"
)

func main() {
	// 使用 make 创建切片
	slice1 := make([]int, 5) // 创建一个包含 5 个整数的切片
	fmt.Println("使用 make 创建的切片:", slice1)

	// 使用 new 创建切片
	slicePtr := new([]int) // 创建一个指向切片的指针
	fmt.Println("使用 new 创建的切片指针:", slicePtr)
}
go 复制代码
使用 make 创建的切片: [0 0 0 0 0]
使用 new 创建的切片指针: &[]
相关推荐
张忠琳1 分钟前
【Go 1.26.4】Golang Map 深度解析
开发语言·后端·golang
Vertira2 分钟前
如何对QT开发的软件进行打包[已解决]
开发语言·qt
AI人工智能+电脑小能手4 分钟前
【大白话说Java面试题 第110题】【并发篇】第10题:CAS 存在哪些问题?
java·开发语言·面试
石一峰69912 分钟前
C 语言函数设计模式实战经验
c语言·开发语言·设计模式
sitellla18 分钟前
Pydub:用 Python 处理音频,不写废话
开发语言·python·其他·音视频
xingyuzhisuan26 分钟前
缓存命中率提升方案:从 30% 优化至 82% 全流程优化记录
java·开发语言·缓存·ai
郑洁文32 分钟前
基于Python的恶意流量监测系统的设计与实现
开发语言·python
AI玫瑰助手34 分钟前
Python流程控制:for循环与range函数的搭配使用
开发语言·python·信息可视化
一条泥憨鱼37 分钟前
Java开发效率神器:Lombok从入门到精通!
java·后端·学习·开发·lombok
anew___37 分钟前
2026年Python爬虫技术完全指南:从入门到实战
开发语言·爬虫·python