【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 简单的获取内存地址

相关推荐
灯澜忆梦14 分钟前
【dp_1】爬楼梯 | 斐波那契数 | 第 N 个泰波那契数 | 三步问题
算法·golang
十五年专注C++开发23 分钟前
C++之std::numeric_limits介绍
开发语言·c++·limits
2501_9259633825 分钟前
Hi3516 + WS73 SDIO Wi-Fi 适配笔记
java·开发语言
CoderYanger27 分钟前
视频切割脚本(Python版)
linux·开发语言·windows·后端·python·程序人生·职场和发展
辞旧 lekkk27 分钟前
CMake工程指南(一)
linux·运维·服务器·开发语言·qt·学习·萌新
小七在进步44 分钟前
数据结构:用栈实现队列
开发语言·数据结构
KaMeidebaby1 小时前
卡梅德生物技术快报|噬菌体筛选:噬菌体筛选工程化优化方案:基于侵染全链条参数调控与水环境应用验证
java·开发语言·人工智能·机器学习·spark
geovindu1 小时前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
CoderYanger1 小时前
视频裁剪+缩放+自动添加水印脚本(Python版)
开发语言·后端·python·程序人生·职场和发展·音视频·学习方法
酷酷的身影1 小时前
Managers/APConfigManager.cs
开发语言·ui·c#