Golang基础-new、make区别

在 Go 语言中,makenew 是两个用于分配内存的关键字,但它们的用途和使用场景有明显区别:


1. new 关键字

用途

  • new 用于为类型分配一块零值化的内存,并返回指向这块内存的指针。

  • 返回值始终是一个指针,指向所分配类型的内存地址(例如:*int*struct)。

适用场景

  • 当你需要获得某个类型的指针,但不需要初始化内部数据结构时,使用 new

  • 常用于分配基本数据类型(如 intfloat64)或自定义的结构体。

示例代码

package main
​
import "fmt"
​
func main() {
    // 使用 new 分配内存
    p := new(int)    // 分配一个 int 类型的内存,值为 0,返回指针
    fmt.Println(*p)  // 输出 0
    *p = 42          // 修改指针指向的值
    fmt.Println(*p)  // 输出 42
}

特点:

  • 分配的内存是零值初始化的(对于 int 是 0,对于 string"",对于 struct 的字段是其各自的零值)。

  • 只分配内存,但不会进一步初始化数据结构。


2. make 关键字

用途

  • make 仅用于创建和初始化内置的数据结构slicemapchannel)。

  • 返回的是已经初始化的非零值(如初始化后的 slicemap),而不是指针。

适用场景

  • 当你需要创建和使用 slicemapchannel 时,使用 make

  • 它不仅分配了内存,还完成了必要的初始化,使得这些数据结构可以直接使用。

示例代码

package main
​
import "fmt"
​
func main() {
    // 使用 make 创建一个 slice
    s := make([]int, 5, 10)  // 创建一个长度为 5,容量为 10 的 slice
    fmt.Println(s)           // 输出 [0 0 0 0 0]
​
    // 使用 make 创建一个 map
    m := make(map[string]int) 
    m["key"] = 42
    fmt.Println(m)           // 输出 map[key:42]
​
    // 使用 make 创建一个 channel
    c := make(chan int, 2)   
    c <- 1
    c <- 2
    fmt.Println(<-c)         // 输出 1
}

特点:

  • 必须配合 slicemapchannel 使用。

  • 这些数据结构的零值(nil)是不可用的,因此必须通过 make 初始化。


3. newmake 的区别

特性newmake
适用类型任意类型仅适用于 slicemapchannel
返回值指针(*T初始化后的具体类型(T
是否初始化只分配内存,零值初始化分配内存并完成初始化
使用场景基本类型或自定义类型的指针分配创建可用的 slicemapchannel

4. 何时使用 newmake

使用 new 的场景:

  • 当你需要分配基本类型(如 intfloat64)或结构体的内存,并获得一个指针。

  • 例如,需要在堆上分配内存,并通过指针修改其值:

p := new(int)    // 分配 int 的内存
*p = 100         // 使用指针修改值

使用 make 的场景:

  • 当你需要初始化和使用

    slice
    
    map

    channel

    时:

    • slice:需要预分配容量以提高性能或控制大小。

    • map:需要确保 map 可用(未初始化的 mapnil,无法使用)。

    • channel:需要设置缓冲区大小,或创建无缓冲通道。


5. 常见误区

  • 试图使用 new 创建 slicemap 会导致运行时错误:

m := new(map[string]int) // m 是 *map 类型,未初始化
(*m)["key"] = 42         // 运行时错误:分配的 map 没有初始化

正确方式:

m := make(map[string]int) // 初始化
m["key"] = 42             // 正常使用

总结

  • new 用于分配任意类型的零值内存,返回指针;适合结构体或基本类型。

  • make 用于分配并初始化内置数据结构(slicemapchannel),返回初始化后的对象,直接可用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yy_Yyyyy_zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值