Go 中 NEW 和 MAKE 的区别

简介: Go 中 NEW 和 MAKE 的区别

在 Go 语言中,newmake 是两个用于创建数据结构的关键字,它们之间有一些重要的区别:

  1. 适用的数据类型:

    • new 用于创建指针类型,它分配内存并返回指向该内存的指针。
    • make 用于创建 slice、map 和 channel 这三种引用类型,它返回初始化后的(非指针的)值。
  2. 内存分配方式:

    • new(T) 分配 T 类型大小的内存空间,并返回指向该内存的指针 *T
    • make(T, args) 则会根据 T 的类型执行不同的初始化操作。对于 slice,它会分配内存并初始化;对于 map,它会分配并初始化内部数据结构;对于 channel,它会创建一个 unbuffered 或 buffered 的通道。
  3. 返回值类型:

    • new(T) 返回一个指向新分配的 T 类型零值的指针 *T
    • make(T, args) 返回的是初始化后的 T 类型的值,而非指针。

举例说明:

// 使用 new 创建指针类型
p := new(int)
*p = 42 // 给指针指向的值赋值

// 使用 make 创建 slice、map 和 channel
s := make([]int, 0, 10) // 创建一个初始容量为 10 的 slice
m := make(map[string]int) // 创建一个 map
c := make(chan int, 100) // 创建一个容量为 100 的 channel

总的来说,new 适用于创建基本类型的指针,而 make 适用于创建 slice、map 和 channel 这三种引用类型。new 返回指针,make 返回初始化后的值。合理选择使用 new 还是 make 可以让您的代码更加优雅和高效。

相关文章
|
12月前
|
Go
终极对决:Go语言make和new完整比较
终极对决:Go语言make和new完整比较
792 0
|
2月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
2月前
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
2月前
|
Unix 编译器 Go
|
2月前
|
Go
go build与go install的区别
go build与go install的区别
go build与go install的区别
|
2月前
|
Go
深入理解 Go 中的 new() 和 make() 函数
深入理解 Go 中的 new() 和 make() 函数
|
2月前
|
存储 Go
go 切片长度与容量的区别
go 切片长度与容量的区别
|
2月前
|
存储 Go 数据处理
C 数组和 Go 切片的区别详解
【8月更文挑战第31天】
30 0
|
4月前
|
安全 Go 开发者
Go语言中的空值与零值有什么区别?
在Go语言中,`nil`和零值有显著区别。`nil`用于表示指针、通道等类型的“无”或“不存在”,而零值是类型的默认值,如数字的0,字符串的`''`。`nil`常用于未初始化的变量或错误处理,零值用于提供初始值和避免未初始化的使用。理解两者差异能提升代码质量和稳定性。
|
5月前
|
存储 Go