golang中make与new有什么区别?

前言

记录下go语言中函数new与make的使用和区别,关于go语言中new和make是内建的两个函数,主要用来创建分配类型内存。


目录

make介绍

在Go语言中,make 是一个用于创建切片、映射(map)和通道(channel)等引用类型的内置函数。make 的主要作用是为这些引用类型分配内存并进行初始化。

用法:

1. 创建切片(slice):
go 复制代码
slice := make([]int, 5) // 创建一个包含5个整数的切片

make 接受两个参数,第一个是类型,第二个是长度。对于切片,还可以提供一个可选的容量参数:

go 复制代码
slice := make([]int, 5, 10) // 创建一个长度为5,容量为10的切片
2. 创建映射(map):
go 复制代码
myMap := make(map[string]int) // 创建一个字符串到整数的映射
3. 创建通道(channel):
go 复制代码
ch := make(chan int) // 创建一个整数类型的通道

注意事项:

  1. make 只能用于引用类型的数据结构,不能用于值类型(例如结构体)的创建。
  2. make 返回被初始化的引用类型实例,而不是指针。
  3. 对于切片和映射,make 除了分配内存,还会初始化内部的数据结构,确保它们可以被直接使用。
  4. 对于通道,make 会创建并返回一个未被缓冲的通道。

总体而言,make 主要用于创建引用类型并进行初始化,以确保它们可以被正确地使用。

new介绍

在Go语言中,new 是一个用于为值类型分配内存并返回指向新分配的零值实例的指针的内置函数。new 主要用于创建值类型的实例,例如结构体。以下是 new 的基本用法和注意事项:

用法:

1. 创建值类型实例:
go 复制代码
ptr := new(int) // 创建一个整数类型的指针,指向新分配的零值整数
2. 创建结构体实例:
go 复制代码
type MyStruct struct {
    Field1 int
    Field2 string
}

instance := new(MyStruct) // 创建一个 MyStruct 类型的指针,指向新分配的零值结构体

注意事项:

  1. new 返回一个指向新分配内存的零值实例的指针。
  2. 对于值类型,new 分配的内存会被初始化为零值。
  3. new 接受一个参数,即要分配内存的类型,并返回一个指向该类型的零值的指针。
  4. new 不适用于引用类型(如切片、映射和通道),只能用于值类型的创建。
  5. new 分配的内存不会被清理,需要程序员负责释放。

总体而言,new 主要用于为值类型分配内存,并返回一个指向新分配的零值实例的指针。在实际使用时,根据需要选择使用 new 还是直接声明和初始化。

make与new的异同

make 和 new 都是用于在Go语言中进行内存分配的内置函数,但它们的用途和行为有一些关键的区别。

相同点:

  1. 内存分配: 两者都用于在堆上分配内存。

不同点:

1. 适用类型:
  • make: make: 只用于slice、map以及channel的初始化。

    go 复制代码
    slice := make([]int, 5)
  • new: 用于创建值类型的实例,例如结构体。返回一个指向新分配的零值实例的指针。

    go 复制代码
    ptr := new(int)
2. 返回类型:
  • make: 返回被初始化的引用类型实例,而不是指针。

  • new: 返回一个指向新分配的零值实例的指针。

3. 参数:
  • make: 接受类型和长度等参数,用于初始化引用类型的内部数据结构。

    go 复制代码
    slice := make([]int, 5)
  • new: 只接受类型参数,返回一个指向该类型的零值的指针。

    go 复制代码
    ptr := new(int)
4. 初始化:
  • make: 除了分配内存,还会初始化引用类型的内部数据结构。

  • new: 分配的内存会被初始化为零值。

总结:

  • 使用 make 主要用于初始化引用类型,确保它们可以被直接使用。
  • 使用 new 主要用于为值类型分配内存,返回一个指向新分配的零值实例的指针。

选择使用 make 还是 new 取决于您要创建的数据结构的类型和初始化需求。

相关推荐
小小龙学IT几秒前
Go 语言 gRPC(grpc-go)深度解析
rpc·架构·golang·go
CoderYanger9 分钟前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划
Frank_refuel28 分钟前
【C++】智能指针
开发语言·c++
泡海椒37 分钟前
JQuick-Excel VALIDATION 实战:用作用范围约束 Excel 导入校验
开发语言·python·excel
xuxigifxfh1 小时前
HJ11 数字颠倒
java·开发语言·华为机考
一只旭宝1 小时前
数据结构与算法复习手册:从写过,到讲清楚
开发语言·数据结构·c++·算法
百度一下吧1 小时前
断网后 WebView 加载单页面应用:页面跳转 JS 加载失败的处理方案
开发语言·javascript·ecmascript
神仙别闹2 小时前
基于C语言开发的捕捉流星小游戏
c语言·开发语言
microrain2 小时前
KNX 现场没有寄存器表:SagooIoT 楼宇驱动插件的组地址、DPT 与隧道
物联网·golang·开源·sagooiot
程序员Sunday2 小时前
Promise.all、allSettled、race、any 怎么选,失败后其他请求会怎样
开发语言·前端·javascript