前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Go中make和new的区别

Go中make和new的区别

作者头像
程序猿川子
发布2025-03-05 16:03:17
发布2025-03-05 16:03:17
8100
代码可运行
举报
运行总次数:0
代码可运行

在 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仅仅分配内存并将对象初始化为对应类型的零值。对于结构体等复合类型,其内部的字段可能还需要进一步的初始化才能正常使用。

例如:

代码语言:javascript
代码运行次数:0
复制
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)
}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档