Go 语言中的 `new` 关键字(创建指针)

在 Go 语言中,new 是一个内置函数,用于 分配内存并返回指向该类型的指针 。理解 new 是掌握指针和内存管理的基础。


1. new 的基本语法

go 复制代码
p := new(Type)
  • Type:要创建的类型(可以是基本类型、结构体等)
  • 返回值:*Type,指向新分配的内存
  • 内存会被初始化为该类型的 零值

2. 示例:基本类型

go 复制代码
p := new(int)
fmt.Println(p)  // 输出指针地址,例如 0xc0000140b0
fmt.Println(*p) // 输出值 0(int 的零值)

*p = 100       // 给指针指向的内存赋值
fmt.Println(*p) // 输出 100

解释:

  1. new(int) 分配了一个 int 类型的内存,初始值为 0
  2. p*int 类型的指针
  3. 使用 *p 可以访问或修改这个值

3. 示例:结构体

go 复制代码
type Todo struct {
    Title  string
    Status bool
}

todoPtr := new(Todo)
fmt.Println(todoPtr)  // 输出指针,例如 &{"" false}
fmt.Println(*todoPtr) // 输出值,结构体零值 {"" false}

todoPtr.Title = "学Go"
todoPtr.Status = true
fmt.Println(*todoPtr) // 输出 {学Go true}

解释:

  • new(Todo) 分配了一个 Todo 结构体的内存
  • 返回指针类型 *Todo
  • 可以直接通过指针访问字段(Go 会自动解引用)

4. new vs 取地址符 &

方法 说明 例子
new(Type) 分配零值内存,返回指针 p := new(int)
&Type{} 创建类型实例,返回指针 p := &Todo{Title:"学Go"}

差别:

  • new:返回零值指针
  • &Type{}:可以直接初始化字段

示例:

go 复制代码
a := new(int)    // *int, 值为 0
b := &int(10)   // *int, 值为 10

t1 := new(Todo)     // *Todo, Title="", Status=false
t2 := &Todo{Title: "学Go"} // *Todo, Title="学Go", Status=false

总结:new 更偏向"先分配内存再赋值零值",&Type{} 可以顺便初始化字段。


5. Go 中指针的使用注意点

  1. Go 语言没有指针运算,不像 C/C++ 那样危险
  2. new 返回指针类型,可以直接传递给函数修改原对象
  3. 函数参数传指针 = 修改原对象,传值 = 修改副本

示例:

go 复制代码
func updateTitle(t *Todo) {
    t.Title = "改标题"
}

todo := new(Todo)
updateTitle(todo)
fmt.Println(todo.Title) // 输出 "改标题"

6. 总结

  • new(Type):分配零值内存,返回指针 *Type
  • 可以用于基本类型、结构体、数组等
  • &Type{} 配合使用,可以初始化字段
  • 指针可以直接修改原内存中的值,是 Go 管理内存和函数调用传递的重要手段
相关推荐
逸Y 仙X1 小时前
文章三十一:ElasticSearch 管道聚合
java·大数据·elasticsearch·搜索引擎·全文检索
Full Stack Developme1 小时前
Spring 发展历史
java·后端·spring
南宫萧幕2 小时前
HEV能量管理建模实战:从零搭建 Simulink 物理环境到 Python(DQN) 强化学习联合仿真调通
开发语言·python·算法·matlab·汽车·控制
x_yeyue2 小时前
2026第十七届蓝桥杯c++B组省赛题解
笔记·算法·蓝桥杯·acm·题解
组合缺一2 小时前
Java 流程编排新范式 Solon Flow:一个引擎,七种节点,覆盖规则/任务/工作流/AI 编排全场景
java·spring·ai·solon·workflow·flow
handler012 小时前
【C++ 算法竞赛基础】数论篇:核心公式、经典例题与高频模板
开发语言·c++·算法·蓝桥杯·数论·最大公约数·最小公倍数
largecode2 小时前
企业号码认证可以线上办理吗?支持线上申请,设置来电显示品牌名
java·python·智能手机·微信公众平台·facebook·paddle·新浪微博
humcomm2 小时前
2026年 Java 面试新特点
java·开发语言·面试
lili00122 小时前
CC GUI 插件架构剖析:如何为 JetBrains IDE 打造完整的 AI 编程工作台
java·ide·人工智能·python·架构·ai编程