golang 中 make 和 new 的区别?

在Go语言中,makenew 都是用于内存分配的关键字,但它们在使用场景、返回值和初始化方式等方面存在一些区别,以下是具体分析:

  • 使用场景
    • make 只能用于创建 mapslicechannel 这三种引用类型,用于初始化这些类型的实例并为其分配底层内存。
    • new 用于为任何类型分配内存,返回指向新分配内存的指针,通常用于值类型,如结构体、基本类型等。
  • 返回值
    • make 返回的是类型本身,而不是指针。例如,make([]int, 5) 返回的是一个 int 类型的切片,而不是指向切片的指针。
    • new 返回的是指向新分配内存的指针。例如,new(int) 返回的是一个指向 int 类型的指针。
  • 初始化方式
    • make 不仅会分配内存,还会对分配的内存进行初始化。例如,创建一个 map 时,make 会初始化 map 的内部数据结构,使其可以直接使用。对于 slice,会根据指定的长度和容量分配内存,并将元素初始化为类型的零值。对于 channel,会创建一个指定类型和缓冲区大小的通道。
    • new 只是分配内存,并将分配的内存初始化为类型的零值。例如,new(int) 分配的内存中存储的是 0new(struct) 分配的内存中,结构体的每个字段都被初始化为零值。

以下是一个简单的示例代码,演示了 makenew 的用法和区别:

go 复制代码
package main

import "fmt"

func main() {
    // 使用make创建一个map
    m := make(map[string]int)
    m["key"] = 100
    fmt.Println(m)

    // 使用new创建一个int类型的指针
    p := new(int)
    *p = 200
    fmt.Println(*p)
}

在上述代码中,使用 make 创建了一个 map,并直接对其进行赋值操作。使用 new 创建了一个 int 类型的指针,通过指针间接修改了其所指向的值。

相关推荐
shark_chili9 分钟前
JITWatch实战指南:深入Java即时编译优化的黑科技工具
后端
xxy.c11 分钟前
嵌入式解谜日志—多路I/O复用
linux·运维·c语言·开发语言·前端
数据爬坡ing16 分钟前
C++ 类库管理系统的分析与设计:面向对象开发全流程实践
java·运维·开发语言·c++·软件工程·软件构建·运维开发
DKPT25 分钟前
JVM新生代和老生代比例如何设置?
java·开发语言·jvm·笔记·学习
知彼解己28 分钟前
JVM 运行时数据区域
java·开发语言·jvm
绝无仅有30 分钟前
从拉取代码到前端运行访问:Vue 前端项目的常规启动流程
后端·面试·github
小蒜学长32 分钟前
spring boot驴友结伴游网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
坠金32 分钟前
CentOS安装或升级protoc
linux·c语言·开发语言
江团1io033 分钟前
一篇文章带你彻底搞懂 JVM 垃圾收集器
java·开发语言·jvm
CodeLongBear34 分钟前
深入理解 JVM 字节码文件:从组成结构到 Arthas 工具实践
java·jvm·后端