当前位置: 首页 > article >正文

Go中new和make的区别对比

Go 中 newmake 的区别

在 Go 语言中,newmake 都用于分配内存,但它们的使用场景和行为有显著的区别。
在这里插入图片描述


1. new

定义

new 是 Go 语言中的一个内置函数,用于分配内存并返回指向该内存的指针。new 分配的内存会被初始化为零值。

作用
  • 分配内存:为指定类型分配内存,并返回指向该内存的指针。
  • 零值初始化:分配的内存会被初始化为该类型的零值。
使用场景
  • 值类型:适用于分配值类型(如 intfloat64struct 等)的内存。
  • 指针类型:适用于需要返回指针的场景。

2. make

定义

make 是 Go 语言中的一个内置函数,用于分配并初始化切片、映射和通道等引用类型的数据结构。make 返回的是初始化后的引用类型,而不是指针。

作用
  • 分配内存:为切片、映射和通道分配内存。
  • 初始化数据结构:对分配的内存进行初始化,使其可以直接使用。
使用场景
  • 切片:适用于创建和初始化切片。
  • 映射:适用于创建和初始化映射。
  • 通道:适用于创建和初始化通道。

3. newmake 的区别

特性newmake
适用类型值类型(如 intstruct 等)引用类型(如 slicemapchannel 等)
返回值返回指向分配内存的指针返回初始化后的引用类型
初始化分配的内存被初始化为零值分配的内存被初始化为可用的数据结构
使用场景适用于需要指针的场景适用于需要初始化引用类型的场景

new 和 make
new
make
分配内存
返回指针
零值初始化
分配内存
返回引用类型
初始化数据结构

new的使用

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    // 使用 new 分配内存并返回指针
    p := new(Person)
    fmt.Println(p) // 输出: &{ 0}

    // 修改指针指向的值
    p.Name = "Alice"
    p.Age = 30
    fmt.Println(p) // 输出: &{Alice 30}
}

make的使用

package main

import "fmt"

func main() {
    // 使用 make 创建切片
    slice := make([]int, 5)
    fmt.Println(slice) // 输出: [0 0 0 0 0]

    // 使用 make 创建映射
    m := make(map[string]int)
    m["key"] = 42
    fmt.Println(m) // 输出: map[key:42]

    // 使用 make 创建通道
    ch := make(chan int, 1)
    ch <- 42
    fmt.Println(<-ch) // 输出: 42
}

http://www.kler.cn/a/518925.html

相关文章:

  • JVM深入学习(一)
  • 【数据结构】深入解析:构建父子节点树形数据结构并返回前端
  • 乒乓球日常烧拍日记之四海绵支撑
  • 专为课堂打造:宏碁推出三款全新耐用型 Chromebook
  • [极客大挑战 2019]BuyFlag1
  • 大模型学习计划
  • 机器学习的通俗解释
  • Node.js下载安装及环境配置教程 (详细版)
  • 服务器中的流量主要是指什么?
  • RPC是什么?和HTTP区别?
  • Python 对列表进行排序的 5 种方法
  • C++17 新增属性详解
  • Unity在WebGL中拍照和录视频
  • 通过Python编程语言实现“机器学习”小项目教程案例
  • 【Rust自学】15.2. Deref trait Pt.1:什么是Deref、解引用运算符*与实现Deref trait
  • Mongodb副本集群为什么选择3个节点不选择4个节点
  • 【Matlab高端绘图SCI绘图模板】第002期 绘制面积图
  • Spring中的事务管理器TransactionManager
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.2 ndarray解剖课:多维数组的底层实现
  • 「 机器人 」扑翼飞行器混合控制策略缺点浅谈
  • 在centos下使用containerd管理容器:5分钟从docker转型到containerd
  • go并发原语源码系列(二)sync.WaitGroup
  • How to learn html?基于chatGLM-b生成示例(仅供参考)
  • 【C++】类与对象初级应用篇:打造自定义日期类与日期计算器(2w5k字长文附源码)
  • 双注意力模块DAB详解及代码复现
  • 05.KNN算法总结