欢迎,来自IP地址为:44.201.97.138 的朋友


Golang 也就是 Go 语言,是一种强类型编译式编程语言,其设计哲学是简单和高效。

在使用切片、映射和通道等数据结构时,我们可能会遇到 new() 和 make() 函数。虽然两者都用于内存分配,但它们的用途却是不同的。

在本文中,我们将探讨 Go 中 new() 和 make() 之间的区别,并讨论何时正确的使用它们。

new() 函数

Go 中的 new() 函数是一个内置函数,它为指定类型的新零值分配内存并返回指向该零值的指针。它主要用于初始化和获取指向给定类型的新分配零值的指针,通常用于结构体等数据类型。

以下是一个简单的例子:

package main

import "fmt"

type Person struct {
	Name   string
	Age    int
	Gender string
}

func main() {
	// Using new() to allocate memory for a Person struct
	p := new(Person)

	// Initializing the fields
	p.Name = "Dae Hub"
	p.Age = 30
	p.Gender = "Male"

	fmt.Println(p)
}

执行结果为:
&{Dae Hub 30 Male}

在这个例子中,new(Person) 为新的 Person 结构分配内存,p 是指向新分配的零值的指针。

make() 函数

另一方面,make() 函数用于初始化切片、映射和通道 (需要 runtime 初始化的数据结构)。与 new() 不同,make() 返回指定类型的初始化(非零)值。

下面是一个切片的例子:

package main

import "fmt"

func main() {
	// Using make() to create a slice with a specified length and capacity
	s := make([]int, 10, 15)

	// Initializing the elements
	for i := 0; i < 10; i++ {
		s[i] = i + 1
	}

	fmt.Println(s)
}

执行结果为:
[1 2 3 4 5 6 7 8 9 10]

在此示例中,make([]int, 10, 15) 创建了一个长度为 10、容量为 15 的整数切片。make() 函数确保该切片用非零值初始化。

何时使用 new() 及 make()

对于值类型使用 new() 函数:

处理结构体等值类型时,可以使用 new() 为新的零值分配内存。这适用于需要指向已初始化结构的指针的情况。

对于引用类型使用 make() 函数:

对于切片、映射和通道,初始化涉及设置数据结构和内部指针,使用 make() 创建初始化实例。

需要强调的是,new() 函数返回一个指针,而 make() 函数返回一个非零值。我们根据是否需要指针或初始化值来选择适当的方法。

理解 Go 语言中 new() 函数和 make() 函数的区别对于编写干净高效的代码至关重要。通过对适当的数据类型使用正确的方法,就可以确保在 Go 程序中正确分配和初始化内存。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注