Go中make和new的区别

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 在 Go 语言中,`make` 和 `new` 都用于分配内存,但功能不同。`make` 用于初始化切片、映射和通道,并返回初始化后的对象;`new` 分配内存并返回指向零值的指针,适用于任何类型。`make` 返回的是数据结构本身,而 `new` 返回指针。`make` 完整初始化特定数据结构,`new` 只初始化为零值。

在 Go 语言中,makenew都用于分配内存,但它们有以下区别:

一、功能不同

  • make用于初始化切片(slice)、映射(map)和通道(channel)这三种特定的数据结构,并返回一个初始化后的对象。它不仅分配内存,还会对这些数据结构进行内部的初始化操作,使其处于可用状态。
  • new用于分配内存并返回一个指向新分配类型零值的指针。它可以用于任何类型,但主要用于值类型(如结构体)和基本数据类型的内存分配。

二、返回值类型不同

  • make返回的是初始化后的特定数据结构本身,而不是指针。例如,make([]int, 5)返回一个长度为 5 的切片,而不是指向切片的指针。
  • new返回的是指向新分配类型零值的指针。例如,new(int)返回一个指向整数类型零值的指针。

三、适用场景不同

  • make适用于切片、映射和通道的初始化,因为这些数据结构需要特定的内部初始化操作才能正常使用。例如,如果你要创建一个切片来存储一系列整数,使用make([]int, length, capacity)可以确保切片有正确的长度和容量,并初始化为整数类型的零值。
  • new适用于需要分配内存并返回一个指向新分配对象的指针的场景。例如,当你要创建一个结构体实例并在多个地方传递其指针时,可以使用new(StructType)来分配内存并获得一个指向新结构体的指针。

四、初始化程度不同

  • make会对特定的数据结构进行完整的初始化,包括设置长度、容量(对于切片和通道)、内部的哈希表(对于映射)等,使其可以立即使用。
  • new仅仅分配内存并将对象初始化为对应类型的零值。对于结构体等复合类型,其内部的字段可能还需要进一步的初始化才能正常使用。

例如:

go

代码解读

复制代码

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    // 使用 make 创建一个切片
    s := make([]int, 5)
    fmt.Println(s)

    // 使用 make 创建一个映射
    m := make(map[string]int)
    fmt.Println(m)

    // 使用 make 创建一个通道
    c := make(chan int)
    fmt.Println(c)

    // 使用 new 创建一个结构体指针
    p := new(Person)
    fmt.Println(p)
}


转载来源:https://juejin.cn/post/7424338056919416858


目录
打赏
0
0
0
0
138
分享
相关文章
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
103 1
Go nil 空结构体 空接口有什么区别?
深入理解 Go 中的 new() 和 make() 函数
深入理解 Go 中的 new() 和 make() 函数
C 数组和 Go 切片的区别详解
【8月更文挑战第31天】
67 0
|
10月前
|
Go
Go 中 NEW 和 MAKE 的区别
Go 中 NEW 和 MAKE 的区别
Golang中make与new有何区别?
本文主要给大家介绍了Go语言中函数`new`与`make`的使用和区别,关于Go语言中`new`和`make`是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用。
125 0

数据库

+关注
下一篇
oss创建bucket