在 Go 语言中,new
和 make
都是用于创建新的变量的内置函数,但它们的作用是不同的。
区别
在 Go 语言中,new
和 make
的作用是不同的:
-
new
用于创建一个新的变量,并返回变量的指针。
-
make
用于创建一个新的切片、映射或通道,并返回它们的引用。
虽然 new
和 make
的作用不同,但它们都可以用于创建新的变量。下面是一个示例代码,演示了如何使用 new
和 make
创建新的变量:
package main
import "fmt"
func main() {
var numPtr *int = new(int)
var numSlice []int = make([]int, 3)
fmt.Printf("%v %T\n", numPtr, numPtr)
fmt.Printf("%v %T\n", numSlice, numSlice)
}
在上面的代码中,我们使用 new
创建一个新的整型变量 numPtr
,并使用 make
创建一个新的整型切片 numSlice
。我们可以使用 fmt.Printf
函数打印变量的值和类型,发现 numPtr
是一个指针类型,指向一个值为 0 的整型变量,而 numSlice
是一个切片类型,包含三个值为 0 的整型元素。
用法
在 Go 语言中,new
和 make
的用法有以下几点需要注意:
new
new
用于创建一个新的变量,并返回变量的指针。它的语法如下:
func new(Type) *Type
其中 Type
表示要创建的变量的类型。new
函数会返回一个指向该类型变量的指针,该指针指向的变量会被初始化为零值。
下面是一个示例代码,演示了如何使用 new
创建新的变量:
package main
import "fmt"
func main() {
var numPtr *int = new(int)
var personPtr *Person = new(Person)
fmt.Printf("%v %T\n", numPtr, numPtr)
fmt.Printf("%v %T\n", personPtr, personPtr)
}
type Person struct {
Name string
Age int
}
在上面的代码中,我们使用 new
分别创建了一个新的整型变量 numPtr
和一个新的结构体变量 personPtr
。我们可以使用 fmt.Printf
函数打印变量的值和类型,发现 numPtr
是一个指向一个值为 0 的整型变量的指针,而 personPtr
是一个指向一个空结构体变量的指针。
make
make
用于创建一个新的切片、映射或通道,并返回它们的引用。它的语法如下:
func make(Type, size IntegerType) Type
其中 Type
表示要创建的变量的类型,size
表示类型的长度或容量(仅适用于切片和通道类型)。make
函数会返回一个新的切片、映射或通道的引用,它们会被初始化为零值。
下面是一个示例代码,演示了如何使用 make
创建新的切片、映射和通道:
package main
import "fmt"
func main() {
var numSlice []int = make([]int, 3)
var strMap map[string]string = make(map[string]string)
var numChan chan int = make(chan int, 3)
fmt.Printf("%v %T\n", numSlice, numSlice)
fmt.Printf("%v %T\n", strMap, strMap)
fmt.Printf("%v %T\n", numChan, numChan)
}
在上面的代码中,我们使用 make
分别创建了一个新的整型切片 numSlice
、一个新的字符串映射 strMap
和一个新的整型通道 numChan
。我们可以使用 fmt.Printf
函数打印变量的值和类型,发现 numSlice
是一个包含三个值为 0 的整型元素的切片,strMap
是一个空字符串映射,numChan
是一个容量为 3 的整型通道。
注意事项
在 Go 语言中,需要注意以下几点关于 new
和 make
的使用:
-
new
只能用于创建变量的指针类型,不能用于创建其他类型的变量。
-
make
只能用于创建切片、映射和通道类型的变量,不能用于创建其他类型的变量。
- 使用
new
创建的指针类型变量会被初始化为零值,但不会分配内存空间。
- 使用
make
创建的切片、映射和通道类型变量会被初始化为零值,并分配相应的内存空间。
- 切片、映射和通道类型的变量必须使用
make
创建,否则会导致运行时错误。
下面是一个示例代码,演示了 new
和 make
的一些注意事项:
package main
import "fmt"
func main() {
var numPtr *int = new(int)
fmt.Println(numPtr)
var numSlice []int = make([]int, 3)
fmt.Printf("%v %T\n", len(numSlice), len(numSlice))
fmt.Printf("%v %T\n", cap(numSlice), cap(numSlice))
}
在上面的代码中,我们使用 new
创建了一个新的整型变量 numPtr
,并尝试解引用它,但会导致运行时错误,因为它并没有分配内存空间。我们还尝试使用 make
创建一个新的整型变量 num
,但会导致编译错误,因为 make
只能用于创建切片、映射和通道类型的变量。最后,我们使用 make
创建了一个新的整型切片 numSlice
,并使用 len
和 cap
函数打印了它的长度和容量。
总结
本文介绍了 Go 语言中 new
和 make
的区别、用法和注意事项,并提供了相应的示例代码。虽然 new
和 make
都用于创建新的变量