Go中 new() 与 make() 的区别

new(T) 和 make(T,args) 是Go语言内建函数,用来分配内存,但适用的类型不同。

new(T)会为 T 类型的新值分配已置零的内存空间,并返回地址(指针),即类型为 *T 的值。话句话说就是,返回一个指针,该指针指向新分配的、类型为 T 的零值,如数组,结构体等。

make(T,args)返回初始化之后的 T 类型的值,这个值并不是 T类型的零值,也不是指针 *T ,是经过初始化之后的 T 的引用。make()只适用于 slice 、map 和 channel。

eg:

func main(){
    list := new([]int)
    list = append(list , 1)
    fmt.Println(list)
}

这段代码,不能通过编译。new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。

func main(){
    list := make([]int , 0)
    list = append(list , 1)
    fmt.Println(list)
}

这段代码可以执行,并返回 [1]。因为 make 操作返回的是一个 []int 引用(引用:可理解为 []int 的一个别名)。 该引用是一个切片,所以可以使用 append 操作。

同样的,map 和 channel 建议使用 make() 或字面量的方式进行初始化,不要用 new()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值