返回

Go 语言:make 与 new 的区别 - 搞清楚它们!

后端

了解 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 时,需要考虑以下因素:

  • 数据结构类型
  • 是否需要指向数据结构的指针变量
  • 是否需要动态调整数据结构大小

常见问题解答

  1. 何时使用 make?

    make 用于创建动态数据结构,例如数组、切片、map 和 channel。

  2. 何时使用 new?

    new 用于创建指向内存中新分配值的指针变量。

  3. make 创建的数据结构是哪种类型?

    值类型

  4. new 创建的指针变量是哪种类型?

    引用类型

  5. make 和 new 的性能差异是什么?

    在大多数情况下可以忽略不计,但在创建大量数据结构时,make 可能更有效率。