【golang】make & new

时间:2025-03-30 16:37:41

new

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

func main() {

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

    m[1] = 2

    (m)

}

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

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

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

不推荐这样使用:

package main

import (
	"fmt"
)

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

func main() {

	u := new(User)

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

	(u)
}

make

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

func main() {

    m := make(map[int]int)

    m[1] = 2

    (m)
}

// Output:
map[1:2]

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

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