【golang】make & new

本文详细对比了Go语言中new与make的功能与用法。new用于获取类型零值的指针,适用于所有类型;而make则专门用于slice、map和channel的初始化,能直接返回这些类型而非指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

new

new用来初始化变量并分配内存。它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针。
channel, func, map, slice等零值是nil。

func main() {

    m := *new(map[int]int)    // new返回指针

    m[1] = 2

    fmt.Println(m)

}

// Output:
panic: assignment to entry in nil map

goroutine 1 [running]:
main.main()
	/Users/fenggese/Workspace/golang/mod/test/main.go:11 +0x43
exit status 2

new主要用来获取类型零值的指针。

不推荐这样使用:

package main

import (
	"fmt"
)

type User struct {
	Name string
	Map  map[string]int
}

func main() {

	u := new(User)

	u.Name = "wss"    // 字符串初始化了
	u.Map["wss"] = 24 // new不会初始化结构体里的map    panic nil

	fmt.Println(u)
}

make

即内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型.

func main() {

    m := make(map[int]int)

    m[1] = 2

    fmt.Println(m)
}

// Output:
map[1:2]

只有make 用于可以初始化其内部的数据结构并准备好将要使用的值。

  • make和new都是golang用来分配内存的內建函数,且在堆上分配内存,make 即分配内存,也初始化内存。new只是将内存清零,并没有初始化内存。
  • make返回的还是引用类型本身;而new返回的是指向类型的指针。
  • make只能用来分配及初始化类型为slice,map,channel的数据;new可以分配任意类型的数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值