在 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
解释:
new(int)分配了一个 int 类型的内存,初始值为 0p是*int类型的指针- 使用
*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 中指针的使用注意点
- Go 语言没有指针运算,不像 C/C++ 那样危险
new返回指针类型,可以直接传递给函数修改原对象- 函数参数传指针 = 修改原对象,传值 = 修改副本
示例:
go
func updateTitle(t *Todo) {
t.Title = "改标题"
}
todo := new(Todo)
updateTitle(todo)
fmt.Println(todo.Title) // 输出 "改标题"
6. 总结
new(Type):分配零值内存,返回指针*Type- 可以用于基本类型、结构体、数组等
- 和
&Type{}配合使用,可以初始化字段 - 指针可以直接修改原内存中的值,是 Go 管理内存和函数调用传递的重要手段