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只返回指向初始化内存的指针.
第一个区别是 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 用作某些内置类型(切片、贴图或通道)的“构造函数”。
\n内置 new(T) 函数为 T 类型的新项分配 \xe2\x80\x9czeroed\xe2\x80\x9d 存储空间,并返回其地址,即 *T 类型的值。在 Go 术语中,它返回一个指向新分配的 T 类型零值的指针。例如,以下是创建指向零字节缓冲区值的指针 p 的三种不同方法,每种方法都是等效的:
// 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)\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n