在 Go 语言中,new
是一个内建函数,用于分配内存并返回一个指向新分配的零值的指针。其主要作用是创建一个类型为 T
的新变量,并初始化为该类型的零值,返回指向这个变量的指针。它的语法和基本使用方法如下:
new
函数的基本语法
new(T)
T
是你想要创建的新变量的类型。new(T)
返回的是一个类型为*T
的指针,指向该类型的零值。
返回值
new
函数返回的是指向类型 T
零值的指针。注意,这个指针指向的内存已经被分配,并且其值被初始化为该类型的零值。
例如,new(int)
会返回一个指向零值 0
的 *int
类型指针;new(string)
会返回一个指向零值空字符串 ""
的 *string
类型指针。
示例
package mainimport "fmt"func main() {// 使用 new 创建一个 int 类型的指针,指向 0ptr := new(int)// 输出指针 ptr 所指向的值,应该是 0fmt.Println(*ptr) // 0// 修改 ptr 所指向的值*ptr = 42// 输出修改后的值fmt.Println(*ptr) // 42// 使用 new 创建一个 string 类型的指针,指向空字符串 ""strPtr := new(string)// 输出指针 strPtr 所指向的值,应该是 ""fmt.Println(*strPtr) // ""
}
new
和 make
的区别
在 Go 语言中,new
和 make
都用于分配内存,但它们有显著的区别:
new(T)
:返回一个类型为*T
的指针,并将内存初始化为该类型的零值。make(T, ...)
:用于创建切片(slice)、映射(map)和通道(channel)等引用类型,并初始化它们的内部结构。make
返回的是该引用类型本身,而不是指向它的指针。
示例:new
和 make
对比
package mainimport "fmt"func main() {// 使用 new 创建 int 类型指针,指向 0ptr := new(int)fmt.Println(*ptr) // 0// 使用 make 创建一个切片并初始化slice := make([]int, 5)fmt.Println(slice) // [0 0 0 0 0]
}
在这个例子中,new(int)
返回的是一个指向 int
类型零值的指针,而 make([]int, 5)
创建了一个包含 5 个元素的整数切片。
总结
new(T)
用于为类型T
分配内存,并返回一个指向该内存区域的指针,指针指向该类型的零值。new
是一个简便的内存分配工具,通常用于创建简单类型的指针。new
和make
都用于内存分配,但make
主要用于初始化引用类型(如切片、映射和通道),并返回的是类型本身,而非指针。
通过 new
,你可以轻松地为各种类型创建零值并获取它们的指针,这在一些场景中(如动态分配内存)非常有用。