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 可以让您的代码更加优雅和高效。

相关文章
|
4月前
|
存储 Go
Go中make和new的区别
在 Go 语言中,`make` 和 `new` 都用于分配内存,但功能不同。`make` 用于初始化切片、映射和通道,并返回初始化后的对象;`new` 分配内存并返回指向零值的指针,适用于任何类型。`make` 返回的是数据结构本身,而 `new` 返回指针。`make` 完整初始化特定数据结构,`new` 只初始化为零值。
|
11月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
11月前
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
8月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
164 1
Go nil 空结构体 空接口有什么区别?
|
11月前
|
Go
go build与go install的区别
go build与go install的区别
go build与go install的区别
|
11月前
|
Unix 编译器 Go
|
11月前
|
Go
深入理解 Go 中的 new() 和 make() 函数
深入理解 Go 中的 new() 和 make() 函数
|
11月前
|
存储 Go
go 切片长度与容量的区别
go 切片长度与容量的区别
|
11月前
|
存储 Go 数据处理
C 数组和 Go 切片的区别详解
【8月更文挑战第31天】
85 0
|
5月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。