【Golang】简述make与new内置函数以及两者的区别

new 函数

new 是 Go 内置函数,签名:

go 复制代码
func new(Type) *Type

new函数的作用是:

为指定类型分配一块内存,随后将内存清零(置为零值),最后返回指向该类型的指针

也就意味着,new函数不会做任何初始化工作

new可以作用于所有类型:int、string、struct、数组、切片、map、channel 都能用 new。

但是 slice/map/chan 用 new 几乎没用,因为它们必须初始化才能使用。

简单代码示例:

go 复制代码
package main

import "fmt"

func main() {
    // 1. 给 int 分配内存,返回 *int
    num := new(int)
    fmt.Println(*num)  // 0(自动清零)
    *num = 100
    fmt.Println(*num)  // 100

    // 2. 给结构体分配内存
    type User struct {
        Name string
        Age  int
    }
    u := new(User)
    fmt.Println(u)      // &{ "" 0 }
    u.Name = "张三"
}

make函数

make 签名:

go 复制代码
func make([]T, len ...cap) []T
func make(map[K]V) map[K]V
func make(chan T) chan T

make()只用于 slice、map、channel 三种引用类型:

  • 分配内存 + 完成初始化
  • 返回类型本身(不是指针)
  • 可以直接使用(赋值、存取、发送接收)
    代码示例:
go 复制代码
package main

import "fmt"

func main() {
    // 1. 切片:初始化 len=5, cap=10
    s := make([]int, 5, 10)
    s[0] = 10  

    // 2. map:初始化,可以直接存值
    m := make(map[int]string)
    m[1] = "go" 

    // 3. channel:初始化
    ch := make(chan int, 2)
    ch <- 100   
}

关键特点为

  • 必须用于三种引用类型
  • 返回类型本身,不是指针
  • 分配 + 初始化,创建后可直接使用
  • 支持传入长度、容量参数

make() 与 new() 的区别

看起来二者没有什么区别,都在堆上分配内存,但是它们的行为不同,适用于不同的类型。

  • new(T) 为每个新的类型 T 分配一片内存,初始化为 0 并且返回类型为 *T 的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针 ,它适用于值类型如数组和结构体;它相当于 &T{}
  • make(T) 返回一个类型为 T 的初始值 ,它只适用于 3 种内建的引用类型:切片、mapchannel

换言之,new() 函数分配内存,make() 函数初始化;下图给出了区别:

如何理解 new、make、slice、map、channel 的关系

1.slice、map 以及 channel 都是 golang 内建的一种引用类型,三者在内存中存在多个组成部分, 需要对内存组成部分初始化后才能使用,而 make 就是对三者进行初始化的一种操作方式

2. new 获取的是存储指定变量内存地址的一个变量,对于变量内部结构并不会执行相应的初始化操作, 所以 slice、map、channel 需要 make 进行初始化并获取对应的内存地址,而非 new 简单的获取内存地址

相关推荐
Rain5091 小时前
mini-cc 的 MCP 协议:给 AI 装个 USB-C 接口
c语言·开发语言·前端·人工智能·架构·node.js·ai编程
华科大胡子2 小时前
AI开发者的网络卡点:Anthropic连接超时
开发语言·php
磊 子2 小时前
STL无序关联容器—unorded_set+unorded_map
开发语言·c++
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第84题】【Mysql篇】第14题:为什么用 InnoDB 存储引擎的表建议用整型的自增主键?
java·开发语言·数据库·mysql·面试
YikNjy3 小时前
break和continue
java·开发语言·算法
秋93 小时前
java项目中cpu飙升排查及解决方法
java·开发语言
野生技术架构师3 小时前
牛客网2026最新大厂Java高频面试题精选(附标准答案)
java·开发语言
PH = 73 小时前
JAVA的SPI机制
java·开发语言
IT猿手3 小时前
多目标优化算法:多目标蛇优化算法(Multiple Objective Snake Optimizer,MOSO)(提供MATLAB代码)
开发语言·算法·matlab·动态路径规划·光伏模型参数估计