【一分钟快学】揭秘 Go 语言:new 与 make 的使用方法,避免常见陷阱

在 Go 语言中,newmake 是两个用于分配内存的内置函数,但它们用于不同类型的内存分配,并且有不同的用途。

new 函数

new 函数用于为给定的类型分配内存。它会分配足够的内存来存储该类型的值,并返回一个指向该内存的指针。new(T) 返回的是一个指向类型 T 的零值的指针。这里的 T 可以是任意类型的数据,包括结构体、数组、int、float等基础数据类型。

使用示例:

go 复制代码
ptr := new(int) // 分配内存并将其初始化为 int 的零值,即 0
*ptr = 100      // 设置该内存位置的值

make 函数

make 函数用于为 slice、map 或 channel 类型分配内存,并返回一个初始化的(非零)值。make 只能用于这三种类型,这是因为这些类型在 Go 语言的内部实现上是引用类型,并且需要一个初始化过程。比如,对于 slice,make 不仅分配了存储 slice 元素的内存,还初始化了 slice 的内部结构(比如元素的长度和容量)。

使用示例:

go 复制代码
s := make([]int, 0, 10) // 创建一个初始长度为 0、容量为 10 的 slice

主要区别

  • 用途 : new 用于为任意类型的值分配内存并返回指向这个零值的指针。make 用于初始化 slice、map 和 channel 类型的值。
  • 返回类型 : new(T) 返回的是一个指向类型 T 零值的指针 *Tmake(T, args) 返回的是类型 T 的初始化值,而不是指针。
  • 初始化 : new 返回的是指针,指向的内存被初始化为零值;make 返回的是已经被初始化的值,对于 slice、map 和 channel,这意味着它们是立即可用的,不仅仅是零值。

使用注意事项

  • 当你需要一个空的但是立即可用的 slice、map 或 channel 时,使用 make
  • 当你需要一个指向某类型零值的指针时,使用 new
  • 尽量避免在不必要的情况下使用 new 分配原始类型的指针,因为这可能会导致不必要的间接性和性能开销。
  • 对于结构体,使用 &StructType{} 初始化更为常见,这样可以在创建指针的同时初始化字段值。

常见的坑

  • new 误用于 slice、map 或 channel,结果是得到了这些类型零值的指针,而不是一个可用的实例。
  • 忽略了 make 初始化的 slice 的长度和容量的不同,可能导致在使用时超出范围。

理解 newmake 的区别以及它们各自的用途对于编写高效和正确的 Go 程序至关重要。

相关推荐
不知更鸟4 小时前
Django 项目设置流程
后端·python·django
黄昏恋慕黎明6 小时前
spring MVC了解
java·后端·spring·mvc
G探险者7 小时前
为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
数据库·后端·mysql
百锦再7 小时前
第18章 高级特征
android·java·开发语言·后端·python·rust·django
Tony Bai8 小时前
Go 在 Web3 的统治力:2025 年架构与生态综述
开发语言·后端·架构·golang·web3
程序猿20238 小时前
项目结构深度解析:理解Spring Boot项目的标准布局和约定
java·spring boot·后端
RainbowSea8 小时前
内网穿透配置和使用
java·后端
掘金码甲哥9 小时前
网关上的限流器
后端
q***06299 小时前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
开发语言·后端·golang
GOTXX10 小时前
用Rust实现一个简易的rsync(远程文件同步)工具
开发语言·后端·rust