Go语言中 new 和 make 有什么区别吗?

发布于 1周前 作者 zlyuanteng 最后一次编辑是 5天前 来自 问答

Go语言中 new 和 make 有什么区别吗?

Go语言中的new

Go语言中的new的作用是初始化一个内置类型的指针

函数是内建函数,函数定义:

func new(Type) *Type

使用 new 函数来分配空间 传递给 new 函数的是一个类型,而不是一个值 返回值是指向这个新分配的地址的指针

Go语言中的Make

Go语言中make 的作用是为 slice, map or chan 的初始化 然后返回引用 make 函数是内 建函数,函数定义:

func make(Type, size IntegerType) Type

make(T, args)函数的目的和 new(T)不同 仅仅用于创建 slice, map, channel 而且返回类型是实例

1 回复

在Go语言中,newmake 都是用于内存分配的内置函数,但它们之间有几个关键的区别:

1. 分配的对象类型

  • new(T)new 函数用于分配内存。它接受一个类型 T 作为参数,分配了零值填充的 T 类型的内存空间,并且返回指向这个新分配的内存的指针,即 *T 类型的值。它不初始化内存区域,只是将其置零。

  • make(T, args...)make 函数专用于内建引用类型的初始化,比如 slicemapchan。它返回初始化(非零)后的(不仅仅是分配)类型的值,而不仅仅是内存地址。make 还可以指定这些类型的初始大小。

2. 返回值

  • new(T) 返回一个指向 T 类型零值的指针(*T)。
  • make(T, args...) 返回初始化后的 T 类型的值(比如 []Tmap[K]Vchan T)。

3. 示例代码

package main

import "fmt"

func main() {
    // 使用 new
    a := new(int)
    fmt.Println(*a)    // 输出: 0,因为 a 是指向 int 的指针,其值为 0(int 的零值)

    // 使用 make
    b := make([]int, 5) // 分配了一个有 5 个 int 零值的 slice
    fmt.Println(b)      // 输出: [0 0 0 0 0],b 是一个初始化的 slice

    c := make(map[string]int)
    c["one"] = 1
    fmt.Println(c) // 输出: map[one:1],c 是一个初始化的 map

    d := make(chan bool)
    // 可以在 goroutine 中发送和接收数据到 d
}

总结

  • 使用 new 当你需要一个指向零值的指针时。
  • 使用 make 当你需要初始化一个 slice、map 或 channel 时。make 分配内存并初始化类型。

选择 new 还是 make 取决于你的具体需求,特别是你需要的是指向零值的指针还是一个初始化的复合类型。

回到顶部