商城首页欢迎来到中国正版软件门户

您的位置:首页 >Go 中 new 与 make 如何选择?

Go 中 new 与 make 如何选择?

  发布于2025-09-21 阅读(0)

扫一扫,手机访问

Go 语言中 new 和 make 的选择:内存分配与初始化详解

Go 语言中 new 和 make 的选择:内存分配与初始化详解

如上所述,Go 语言提供了多种内存分配和值初始化的方式,包括 &T{...}、&someLocalVar、new 和 make。理解 new 和 make 的区别,有助于更有效地利用 Go 语言的特性。

new 的使用

new 函数用于分配指定类型的新空间,并将其初始化为零值。它返回的是指向该类型零值的指针。例如:

package main

import "fmt"

type Point struct {
    X, Y int
}

func main() {
    p := new(Point)
    fmt.Println(p) // Output: &{0 0}

    i := new(int)
    fmt.Println(*i) // Output: 0
}

在上面的例子中,new(Point) 分配了一个 Point 类型的内存空间,并将其 X 和 Y 字段初始化为零值。new(int) 则分配了一个 int 类型的内存空间,并将其初始化为 0。

需要注意的是,new 只能分配基本类型和结构体的内存,不能用于分配切片、映射和通道的内存。尝试对 int 类型使用取地址符 & 是非法的,例如 &int。

make 的使用

make 函数专门用于创建切片、映射和通道。与 new 不同,make 返回的是这些类型的实例,而不是指针。例如:

package main

import "fmt"

func main() {
    // 创建一个长度为 0,容量为 10 的 int 类型切片
    s := make([]int, 0, 10)
    fmt.Println(s) // Output: []

    // 创建一个空的 string 类型的映射
    m := make(map[string]string)
    fmt.Println(m) // Output: map[]

    // 创建一个 int 类型的通道
    c := make(chan int)
    fmt.Println(c) // Output: 0x... (通道的地址)
    close(c)       // 关闭通道,防止资源泄露
}

在上面的例子中,make([]int, 0, 10) 创建了一个长度为 0,容量为 10 的 int 类型切片。make(map[string]string) 创建了一个空的 string 类型的映射。make(chan int) 创建了一个 int 类型的通道。

new 和 make 的区别总结

特性newmake
作用分配内存,初始化为零值,返回指针创建切片、映射、通道,返回实例
类型基本类型、结构体切片、映射、通道
返回值指针实例

为什么 Go 语言需要 new 和 make?

理论上,可以将 new 和 make 合并为一个内置函数,例如 NEW,但这样做可能会导致更多的混淆。例如:

// 假设存在一个名为 NEW 的函数
// p := NEW(*chan int)  // * 是必须的
// c := NEW(chan int)

// new(int)        -->  NEW(*int)
// new(Point)      -->  NEW(*Point)
// new(chan int)   -->  NEW(*chan int)
// make([]int, 10) -->  NEW([]int, 10)

// make(Point)  // 非法
// make(int)    // 非法

如果只有一个 NEW 函数,则需要使用 * 来区分指针类型,这可能会增加新手的学习成本。因此,Go 语言选择保留 new 和 make 两个独立的内置函数,以提供更清晰和易于理解的内存分配和初始化方式。

注意事项

  • 在使用 make 创建通道后,记得在使用完毕后关闭通道,以防止资源泄露。使用 close(channel) 关闭通道。
  • new 返回的是指针,需要使用 * 来访问指针指向的值。
  • make 返回的是实例,可以直接使用。

总而言之,new 用于基本类型和结构体的内存分配和零值初始化,返回指针;make 专门用于切片、映射和通道的创建,返回实例。理解它们的区别和使用场景,可以帮助你编写更高效、更易于维护的 Go 代码。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注