New
不会初始化内存,只会将其清零。它返回一个指向新分配的零值的指针。
Make
仅创建切片,地图和通道,并将其初始化返回。
在这种情况下,“初始化”是什么意思?new和make之间还有什么其他区别?
如制作切片,地图和通道中所述:
内置函数make需要一个type
T
,该类型 必须是slice,map或channel type ,还可以选择后面是特定于类型的表达式列表。
它返回类型的值T
(不是*T
)。存储器按照有关初始值的部分所述进行初始化。
例如,对于切片类型
make([]T, length, capacity)
产生与分配数组和切片相同的切片,因此这两个表达式是等效的:
make([]int, 50, 100)
new([100]int)[0:50]
因此,在这里make
创建切片,并根据所使用的类型(此处为int
,所以0
‘)根据零值初始化其内容。
您可以在Go中看到更多关于保持最新和分离的需求:为什么要make()或new()?
戴夫·切尼(Dave Cheney)刚刚写了一篇不错的文章:“
Go同时具有make和new功能,这有什么用? ”
尽管
make
创建泛型slice
,map
和channel
值,但它们仍然 只是常规值; make不返回指针值。如果
new
被取消,make
您将如何构造一个指向初始值的指针?使用
new
构建 指针 到slice
,map
或channel
零值 今天的工作,并与行为一致new
。对于混乱,它们可能引起
make
并new
保持一致;
make
只制作切片,地图和通道,new
只返回指向初始化内存的指针。
问题内容: 简介文档中有很多段落专门介绍了和之间的区别,但是实际上,您可以在本地范围内创建对象并将其返回。 为什么要使用一对分配器? 问题答案: 您可以做的事情,您无法做其他任何事情: 建立频道 创建一个预先分配了空间的地图 创建具有预分配空间或len!= cap的切片 证明有一点困难。使它变得更容易的主要事情是创建指向非复合类型的指针。以下两个功能是等效的。简而言之:
在第7.2.1小节和第10.2.2小节,我们已经讨论过此问题,并使用代码进行详细说明,观点如下: - 切片、映射和通道,使用make - 数组、结构体和所有的值类型,使用new
问题内容: 我是一名新的Java学习者。最近,我在阅读泛型编程,并对此感到困惑。 问题答案: 首先,这些是在不同上下文中使用的完全不同的构造。 是通用类型声明的一部分,例如 它使用类型参数声明泛型类型,并引入界限,因此必须是的子类型。 是带通配符的参数化类型,可以作为普通类型用于变量和方法声明等中: 变量声明诸如装置类型的该被参数化与一些亚型。 例如,给出此声明 您可以: 将的某些子类型分配给:
问题内容: 这两个语句之间有什么区别: 和 如果您能说明差异,那就太好了。 问题答案: 第一个是创建一个新的String对象。第二个是有效地使用已经存在的(它是在加载类文件时创建的)。实际上,从来没有理由使用构造函数。 (我之所以这样说, 实际上是 因为有一种情况:如果要通过调用然后丢弃原始文件来分解大块,则可以使用此构造函数从子字符串中创建new来节省内存。这确实是一个晦涩的情况,虽然。)
问题内容: 关于 Java泛型, 我有一个非常基本的问题。我想这两个和是同质的。我是对的还是我缺少的基本观念? 问题答案: 泛型类型比较古怪。 表示Number或未知的子类。如果获得这样的值,它将是,但是由于您不知道哪个有效,因此无法给出此类型的值。 区别在于参数和返回值。 在一些地方用来表示类型可以是超级类型。例如 在集合中,此方法表示比较器需要能够比较相同类型或任何超级类型。 这意味着你可以
问题内容: 问题答案: 简单说明:使用时 仅可访问其中定义的公共方法。中定义的方法不是。 使用时 定义的公共方法也可以与公共方法一起访问。 两种情况下创建的对象都是相同的。 例如: