欢迎,来自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 程序中正确分配和初始化内存。