new分配零值内存并返回指针,适用于任意类型;make初始化slice、map、channel并返回原类型,仅用于引用类型。示例:new(int)返回*int,初始为0;make(map[string]int)创建可操作的map。关键区别:new返回指针且仅清零,make返回非指针并完成初始化。错误使用如new(map)会导致nil panic。实践中优先用短变量声明替代new,而make在需预设容量时必不可少,正确使用可避免运行时错误。

在Go语言中,make 和 new 是两个内置的内存分配函数,但它们的用途和行为有显著区别。理解它们的差异并正确使用,对编写高效、安全的Go代码至关重要。
new 的作用是为指定类型分配一片内存空间,并将该内存清零(即赋予类型的零值),然后返回指向该内存的指针。
其函数签名如下:
func new(T) *T
立即学习“go语言免费学习笔记(深入)”;
它适用于任何类型 T,返回一个指向新分配的、零值的 T 类型变量的指针。
示例:
ptr := new(int)<br>fmt.Println(*ptr) // 输出 0<br>*ptr = 42<br>fmt.Println(*ptr) // 输出 42
这里 new(int) 分配了一个 int 类型的内存空间,初始值为 0,返回 *int 类型的指针。
注意:new 不适用于 map、slice 或 channel,因为这些类型的零值无法直接使用(如 map 的零值是 nil,不能直接赋值)。
make 用于初始化 slice、map 和 channel 这三种引用类型,使其处于可用状态。它不返回指针,而是返回类型本身。
其函数签名:
func make(T, args...)
其中 T 必须是 slice、map 或 channel。
常见用法:
示例:
slice := make([]int, 5, 10)<br>m := make(map[string]int)<br>ch := make(chan int, 5)
如果不使用 make 直接声明引用类型,它们的值为 nil,无法直接操作:
var m map[string]int<br>m["key"] = "value" // panic: assignment to entry in nil map
举例说明:
ptr := new(map[string]int)<br>fmt.Println(ptr) // 输出指针地址<br>fmt.Println(*ptr) // 输出 map[string]int(nil)</br>(*ptr)["test"] = 1 // panic: assignment to entry in nil map
即使用了 new,map 仍是 nil。必须用 make 才能真正初始化:
m := make(map[string]int)<br>m["test"] = 1 // 正常工作
大多数情况下,不需要手动使用 new。Go 支持短变量声明和自动取址,更推荐直接声明变量或使用复合字面量。
比如代替 new(int):
i := 0<br>ptr := &i
对于结构体,也推荐使用字面量方式:
type Person struct { Name string }<br>p := &Person{Name: "Alice"}而 make 在处理 slice、map、channel 时不可或缺,尤其是在需要预设容量或缓冲大小时,合理使用 make 能提升性能。
基本上就这些。掌握 make 和 new 的区别,能避免常见 nil 指针或运行时 panic,写出更稳健的 Go 程序。
以上就是Golang如何使用内置make与new函数_Golang make new函数使用实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号