首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go 1.26 支持 new(expr):用表达式直接创建指针

Go 1.26 支持 new(expr):用表达式直接创建指针

作者头像
萝卜要努力
发布2025-11-14 12:57:45
发布2025-11-14 12:57:45
740
举报
文章被收录于专栏:萝卜要加油萝卜要加油

前言

Go 语言在即将到来的 1.26 版本 中,对内建函数 new 引入了一个有趣的小修改:从此 new() 不仅能接受类型,还可以接受表达式。这个变化虽小,却能让代码写得更优雅。 本文将以浅显易懂的方式,介绍这个新特性、它背后的原理、使用示例,以及可能带来的影响与限制。

一、变化概述 —— new(expr) 是什么?

在 Go 1.25 及以前版本,new 只能写成:

代码语言:javascript
复制
p := new(int)  // 返回 *int,值为 0

而新版本中,new 可以写成:

代码语言:javascript
复制
p := new(42)  // 返回 *int,值为 42

——对表达式 expr 求值,并把其结果作为初始值写入新分配对象,然后返回指向该对象的指针。(antonz.org)

换句话说:

  • new(T):分配一个零值的 T,返回 *T
  • new(expr):先计算 expr 得到一个值 v(类型为 T),再分配一个类型为 T 的变量,其初始值为 v,返回 *T。(antonz.org)

https://go.dev/play/p/cc0aOdN_tJ4?v=gotip

二、用例示范

示例 1:基础类型
代码语言:javascript
复制
p1 := new(42)
fmt.Println(*p1)  // 输出 42

p2 := new("hello")
fmt.Println(*p2)  // 输出 "hello"
示例 2:复合字面量
代码语言:javascript
复制
p := new([]int{1, 2, 3})
fmt.Println(*p)  // 输出 [1 2 3]

type Person struct { Name string }
p2 := new(Person{Name: "Alice"})
fmt.Println(*p2)  // 输出 {Alice}
示例 3:函数调用表达式
代码语言:javascript
复制
f := func() string { return "Go" }
p := new(f())
fmt.Println(*p)  // 输出 "Go"

注:new(nil) 依然会编译错误,不能传入 nil 表达式。(antonz.org)

三、设计动机与优势

减少样板代码 在以前,如果你想把一个简单值转成指针,通常要先声明一个变量再取地址:

代码语言:javascript
复制
v := 42
p := &v

而现在可以直接写 p := new(42),更简洁。

统一与一致性 允许 new(expr) 后,new(...) 的用途更加灵活统一:既可表示“按类型分配(零值)”,也可表示“按表达式赋初值再分配”。

提升代码可读性 某些场景下表达式本身就很直观,直接写 new(expr) 比先定义再取指针的写法更直观、更少中间变量。

四、潜在局限与注意点

  • 类型表达能力 expr 必须可以在编译时确定其类型(或者是常量表达式、明确类型表达式)。
  • 表达式副作用安全 如果表达式里含有副作用(如函数调用、赋值等),则必须注意其执行时机与语义。
  • nil 与接口场景 对于 nil、接口类型、或者某些复杂类型表达式,可能还需要语言规范与实现进一步明确。
  • 兼容性考虑 虽然这是向后兼容的增强,但在某些工具或分析器中可能暂未支持,需要提前测试。

五、总结

Go 1.26 引入的 new(expr) 虽然是一个“小改动”,却能带来不少语法上的简洁和一致性提升。对于日常的简单值或字面量想要转指针的场景,它尤为便利。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萝卜要加油 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、变化概述 —— new(expr) 是什么?
  • 二、用例示范
    • 示例 1:基础类型
    • 示例 2:复合字面量
    • 示例 3:函数调用表达式
  • 三、设计动机与优势
  • 四、潜在局限与注意点
  • 五、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档