new和make有什么区别?

wiz*_*tjh 16 go

New没有初始化内存,它只是将它归零.它返回指向新分配的零值的指针.

Make 仅创建切片,贴图和通道,并返回初始化的切片,贴图和通道.

在这种情况下,"初始化"意味着什么?新品和品牌之间还有哪些不同之处?

Von*_*onC 19

如制作切片,地图和频道中所述:

内置函数make采用一种类型T,它必须是切片,地图或通道类型,可选地后跟特定于类型的表达式列表.
它返回typeT(not *T)的值.
内存初始化,如初始值一节中所述.

例如,对于Slice类型

make([]T, length, capacity)
Run Code Online (Sandbox Code Playgroud)

生成与分配数组和切片相同的切片,因此这两个表达式是等效的:

make([]int, 50, 100)
new([100]int)[0:50]
Run Code Online (Sandbox Code Playgroud)

所以在这里,make创建切片,并根据零值初始化其内容,如果使用的类型(这里int,所以' 0')

你可以在Go中看到更多关于保持新内容和分开的需要:为什么我要make()或new()?


Dave cheney写了一篇好文章:" Go既有制作又有新功能,是什么赋予了什么? "

虽然make创建了泛型slice,map和channel值,但它们仍然只是常规值; make不返回指针值.

如果new被删除了make,你将如何构造一个指向初始化值的指针?

使用new构建指针到slice,map或channel 零值今天的工作,并与行为一致new.

因为他们可能造成的混乱,make并且new是一致的;

  • make 只制作切片,地图和频道,
  • new 只返回指向初始化内存的指针.

  • @OneOfOne确实.我自己只使用`&struct_name {}`,几乎从不使用`new(struct_name)`.或者我定义`NewStruct()`函数(http://stackoverflow.com/a/23198063/6309) (4认同)

new*_*cct 8

第一个区别是 type:make(T, ...)总是返回 type T,而new(T, ...)总是返回 type *T。这告诉你它们非常不同。

new 适用于所有类型,并为该类型的变量动态分配空间,初始化为该类型的零值,并返回指向它的指针。

一种思考方式是

result = new(T)
Run Code Online (Sandbox Code Playgroud)

总是等价于

var temp T
result = &temp
Run Code Online (Sandbox Code Playgroud)

(换句话说,您可以new通过定义给定类型的变量来做同样的事情,而不是初始化它,然后获取指向它的指针。)

make 用作某些内置类型(切片、贴图或通道)的“构造函数”。


wcc*_*526 6

在此输入图像描述\n内置 new(T) 函数为 T 类型的新项分配 \xe2\x80\x9czeroed\xe2\x80\x9d 存储空间,并返回其地址,即 *T 类型的值。在 Go 术语中,它返回一个指向新分配的 T 类型零值的指针。例如,以下是创建指向零字节缓冲区值的指针 p 的三种不同方法,每种方法都是等效的:

\n\n
// Allocate enough memory to store a bytes.Buffer value\n// and return a pointer to the value\'s address.\nvar buf bytes.Buffer\np := &buf\n\n// Use a composite literal to perform allocation and\n// return a pointer to the value\'s address.\np := &bytes.Buffer{}\n\n// Use the new function to perform allocation, which will\n// return a pointer to the value\'s address.\np := new(bytes.Buffer)\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一方面,make() 函数是一个特殊的内置函数,用于初始化切片、贴图和通道。请注意,make() 只能用于初始化切片、映射和通道,并且与 new() 函数不同,make() 不返回指针。

\n\n

切片、映射和通道也可以使用复合文字表达式以及 make() 进行初始化。下面给出了两种不同(但等效)的方法来初始化映射 m(将字符串键映射到布尔值)作为示例:

\n\n
// Using make() to initialize a map.\nm := make(map[string]bool, 0)\n\n// Using a composite literal to initialize a map.\nm := map[string]bool{}\n\n// You can also initialize maps with initial data using a composite literal,\n// as shown below:\nm := map[string]bool{\n    "java": false,\n    "go":   true,\n}\n
Run Code Online (Sandbox Code Playgroud)\n