Go 语言:make 与 new 的区别 - 搞清楚它们!
2023-08-03 03:10:19
了解 make 与 new:Go 语言中创建变量的秘密武器
前言
Go 语言为开发者提供了两大法宝:make 和 new,它们负责创建变量和数据结构。虽然它们的语法看起来相似,但用法却截然不同。本文将深入剖析 make 和 new 的奥秘,帮助你掌握它们的精髓,从而提升你的 Go 编程技巧。
变量声明:基础知识
在 Go 中,变量声明遵循以下语法:
var <variable_name> <data_type>
例如:
var my_variable int
以上代码声明了一个名为 my_variable 的整数变量。
make 与 new 的本质区别
make:动态数据结构的缔造者
make 专门用于创建动态数据结构,例如数组、切片、map 和 channel。这些结构的特点是,在编译时无法确定其大小,因此需要在运行时利用 make 函数分配内存。
new:指针变量的创造者
new 的职责是创建指向内存中新分配值的指针变量。这些变量通常用于存储来自其他包的数据或创建自定义数据结构。
make 与 new 的实际应用
创建数组
// make 创建一个长度为 10 的整数数组
array := make([]int, 10)
// new 创建一个指向整数数组的指针变量
array_ptr := new([]int)
// 通过指针变量访问数组元素
(*array_ptr)[0] = 10
创建切片
// make 创建一个切片
slice := make([]int, 0, 10)
// new 创建一个指向切片的指针变量
slice_ptr := new([]int)
// 通过指针变量访问切片元素
(*slice_ptr)[0] = 10
创建 map
// make 创建一个 map
my_map := make(map[string]int)
// new 创建一个指向 map 的指针变量
map_ptr := new(map[string]int)
// 通过指针变量访问 map 元素
(*map_ptr)["key"] = 10
创建 channel
// make 创建一个 channel
ch := make(chan int)
// new 创建一个指向 channel 的指针变量
ch_ptr := new(chan int)
// 通过指针变量发送数据到 channel
(*ch_ptr) <- 10
创建自定义数据结构
type Person struct {
name string
age int
}
// new 创建一个 Person 结构体的指针变量
person_ptr := new(Person)
// 通过指针变量访问结构体成员
(*person_ptr).name = "John"
(*person_ptr).age = 30
make 和 new 的深入解析
数据类型差异
make 创建的数据结构是值类型,意味着对它们的修改会反映在原始数据结构上。而 new 创建的指针变量是引用类型,修改指针本身不会影响实际数据结构。
内存分配
make 创建的数据结构在运行时分配内存,这意味着它们的内存空间可能会动态增长或缩小。new 创建的指针变量在编译时分配内存,其内存空间是固定的。
应用范围
make 仅能创建内置数据结构,而 new 可以用于创建任何类型的变量,包括自定义数据结构。
make 与 new 的性能对比
在大多数情况下,make 和 new 的性能差别可以忽略不计。不过,当需要创建大量数据结构时,make 可能更胜一筹,因为它一次性分配内存,提高了性能。
make 与 new 的协同使用
make 和 new 可以搭配使用,创建复杂的数据结构。例如,可以使用 make 创建一个数组,再利用 new 创建一个指向该数组的指针变量。这样可以更方便地访问和修改数组中的元素。
选择 make 还是 new 的标准
在选择使用 make 或 new 时,需要考虑以下因素:
- 数据结构类型
- 是否需要指向数据结构的指针变量
- 是否需要动态调整数据结构大小
常见问题解答
-
何时使用 make?
make 用于创建动态数据结构,例如数组、切片、map 和 channel。
-
何时使用 new?
new 用于创建指向内存中新分配值的指针变量。
-
make 创建的数据结构是哪种类型?
值类型
-
new 创建的指针变量是哪种类型?
引用类型
-
make 和 new 的性能差异是什么?
在大多数情况下可以忽略不计,但在创建大量数据结构时,make 可能更有效率。