Imprescindible para los desarrolladores: cómo usar new y make con precisión para crear aplicaciones de Golang

En el lenguaje Go, new y make son dos funciones integradas para crear objetos. Aunque ambos se utilizan para asignar memoria, existen algunas diferencias importantes en su uso. Este artículo presentará la diferencia entre new y make en detalle, y lo ayudará a comprender sus escenarios de uso a través de varios aspectos de análisis y ejemplos de código.

1. Introducción

En el lenguaje Go, new y make son dos funciones integradas que se usan para crear objetos, y se usan de diferentes formas y funciones. Una comprensión adecuada de la diferencia entre nuevo y hecho es muy importante para escribir un código Go eficiente. A continuación pasamos a través de los detalles de nuevo y hacer.

2. nueva función

2.1 El papel de la nueva función

La nueva función se usa para crear un puntero de un tipo específico e inicializarlo en un valor cero. Devuelve un puntero a la dirección de memoria recién asignada.

2.2 Sintaxis de la nueva función

La sintaxis de la nueva función es muy simple, simplemente siga la palabra clave nueva con el tipo.

 func new(Type) *Type
复制代码

El siguiente es un código de muestra que usa la nueva función para crear un objeto de estructura:

 package main
 ​
 import "fmt"
 ​
 type Person struct {
     Name string
     Age  int
 }
 ​
 func main() {
     p := new(Person)
     fmt.Println(p)
 }
复制代码

En el código anterior, usamos la nueva función para crear un puntero p que apunte al tipo Persona y generar su valor. El resultado es &{0}, lo que indica que p es un puntero al valor cero del tipo Persona.

3. hacer función

3.1 La función de hacer función

La función make se utiliza para crear objetos de tipos integrados, como sectores, mapas y canales, y devuelve un objeto inicializado (valor distinto de cero).

3.2 Sintaxis de la función make

La sintaxis de la función make es diferente de la función new, necesita especificar el tipo y algunos parámetros adicionales.

 func make(Type, size IntegerType) Type
复制代码

Aquí hay un código de muestra que usa la función make para crear sectores, mapas y canales:

 package main
 ​
 import "fmt"
 ​
 func main() {
     // 创建一个长度为5,容量为10的整型切片
     s := make([]int, 5, 10)
     fmt.Println(s)
     
     // 创建一个键为string,值为int的映射
     m := make(map[string]int)
     m["a"] = 1
     m["b"] = 2
     fmt.Println(m)
     
     // 创建一个字符串通道
     c := make(chan string)
     fmt.Println(c)
 }
复制代码

En el código anterior, usamos la función make para crear un segmento entero s con una longitud de 5 y una capacidad de 10, un mapa m con una clave de cadena y un valor de int, y un canal de cadena c. Los resultados de la ejecución son [0 0 0 0 0], map[a:1 b:2] y 0xc0000460c0 respectivamente, lo que indica que todos estos objetos se inicializan con valores distintos de cero.

4. Diferencia y comparación

4.1 Tipos de asignaciones

  • La nueva función se utiliza para la asignación de cualquier tipo y devuelve un puntero a ese tipo.
  • make 函数只用于分配切片、映射和通道,并返回初始化后的切片、映射或通道对象。

4.2 返回值类型

  • new 函数返回指向分配类型的指针。
  • make 返回分配类型的初始化后的非零值。

4.3 使用场景

  • new 函数主要用于创建值类型的实例。值类型包括基本类型(如整型、浮点型、布尔型等)以及结构体。new 函数返回一个指向新分配内存的指针,可以方便地对该实例进行操作和修改。

     package main
     ​
     import "fmt"
     ​
     type Point struct {
         X, Y int
     }
     ​
     func main() {
         p := new(Point)
         p.X = 10
         p.Y = 20
         fmt.Println(p) // 输出:&{10 20}
     }
    复制代码
  • make 函数主要用于创建引用类型的对象。引用类型包括切片、映射和通道。由于引用类型需要在使用之前进行初始化,make 函数返回的是初始化后的非零值对象,而不是指针。

     package main
     ​
     import "fmt"
     ​
     func main() {
         // 创建一个长度为5,容量为10的整型切片
         s := make([]int, 5, 10)
         fmt.Println(s) // 输出:[0 0 0 0 0]
         
         // 创建一个键为string,值为int的映射
         m := make(map[string]int)
         m["a"] = 1
         m["b"] = 2
         fmt.Println(m) // 输出:map[a:1 b:2]
         
         // 创建一个字符串通道
         c := make(chan string)
         fmt.Println(c) // 输出:0xc0000460c0
     }
    复制代码

4.4 示例代码对比

通过下面的示例代码对比,我们可以更清楚地理解 new 和 make 之间的区别:

 package main
 import "fmt"
 ​
 type Person struct {
     Name string
     Age int
 }
 ​
 func main() {
     // 使用new创建Person类型的指针
     p1 := new(Person)
     p1.Name = "Alice"
     p1.Age = 25
     fmt.Println(p1) // 输出:&{Alice 25}
     // 使用make创建切片
     s1 := make([]int, 5, 10)
     s1[0] = 1
     s1[1] = 2
     fmt.Println(s1) // 输出:[1 2 0 0 0]
 }
复制代码

从示例代码可以看出,使用 new 创建的是指针类型,而使用 make 创建的是初始化后的非零值对象。

5. 总结

在本文中,我们详细介绍了 Golang 中 new 和 make 的区别及使用场景。通过对两者的语法和示例代码进行分析,我们得出以下结论:

  • new 用于任何类型的分配,并返回指向该类型的指针,主要用于创建值类型的实例。
  • make 用于分配切片、映射和通道,并返回初始化后的非零值对象,主要用于创建引用类型的对象。

正确理解 new 和 make 的区别对于编写高效、规范的 Go 代码至关重要。在选择使用 new 还是 make 时,要根据具体的需求和对象类型进行判断。希望本文对大家有所帮助,能够更加深入地理解和应用 new 和 make 函数。感谢阅读!

Supongo que te gusta

Origin juejin.im/post/7230308610080292920
Recomendado
Clasificación