️ Go 1.26 对 new 的重大更新
随着 Go 1.26 版本的发布,new 函数的功能得到了显著增强。虽然上述关于 new “只分配不初始化(仅返回零值)”的描述适用于 Go 1.25 及之前的版本,但在 Go 1.26 及之后的版本中,new 的行为有了本质的改变,尤其是支持表达式初始化。
在 Go 1.26 中,new 不再只能创建零值,它现在支持接收一个表达式作为参数。这意味着你可以直接使用 new 来创建并初始化一个值,而不仅仅是分配内存。
- 旧写法(Go 1.25 及以前):
如果你想创建一个指向特定值的指针,你必须先定义变量或使用辅助函数。
p := new(int) // new 返回的是指针
*p = 42 // 必须通过 * 解引用才能赋值
- 新写法(Go 1.26+):
new 可以直接接收字面量或函数返回值,它会复制表达式的结果并返回指向该副本的指针。
// 直接用 new 初始化
p1 := new(42) // *int,指向的值是 42
p2 := new("hello") // *string,指向的值是 "hello"
// 甚至支持函数返回值和复杂表达式
func getDefaultValue() int { return 100 }
p3 := new(getDefaultValue()) // *int,指向的值是 100
p4 := new(2 + 3) // *int,指向的值是 5
️ Go 1.26 对
new的重大更新随着 Go 1.26 版本的发布,
new函数的功能得到了显著增强。虽然上述关于new“只分配不初始化(仅返回零值)”的描述适用于 Go 1.25 及之前的版本,但在 Go 1.26 及之后的版本中,new的行为有了本质的改变,尤其是支持表达式初始化。在 Go 1.26 中,
new不再只能创建零值,它现在支持接收一个表达式作为参数。这意味着你可以直接使用new来创建并初始化一个值,而不仅仅是分配内存。如果你想创建一个指向特定值的指针,你必须先定义变量或使用辅助函数。
new可以直接接收字面量或函数返回值,它会复制表达式的结果并返回指向该副本的指针。