初始化和归零之间的区别,以及GoLang中的new()和make()

初始化和归零之间的区别,以及GoLang中的new()和make(),第1张

概述我来自C#背景,我对GoLang初始化和归零定义的方式感到困惑.我想你可以猜到这种混乱来自Go中的make()和new()函数.当这些方法运行时,我应该在内部发生什么?初始化和归零发生时会发生什么? 我知道GoLang中有一个init()函数用于初始化包.但我认为这与此不同. 无论如何,他们之间有什么区别? 更新 我回答了我自己的问题,请检查一下,看看我的答案. 我想我已经想到并决定分享我到目前为 我来自C#背景,我对Golang初始化和归零定义的方式感到困惑.我想你可以猜到这种混乱来自Go中的make()和new()函数.当这些方法运行时,我应该在内部发生什么?初始化和归零发生时会发生什么?

我知道Golang中有一个init()函数用于初始化包.但我认为这与此不同.

无论如何,他们之间有什么区别?

更新

我回答了我自己的问题,请检查一下,看看我的答案.

我想我已经想到并决定分享我到目前为止的想法.

make()与new()

我想我现在明白了make()和new()之间的区别.起初,它有点混乱,但在这里我得到了:

new就像C#或Java中的new一样,但由于Go中没有构造函数,所有字段(如Java和C#术语)都将归零.归零意味着更像是默认字段.因此,如果字段类型为int,则它将为0,或者如果它是结构,则它将默认为nil,对于字符串类型将默认为“”.当只有无参数构造函数可用时,它实际上类似于C#和Java,并且您没有手动将成员设置为其他内容.

但是,地图,切片和通道等类型是不同的.它们是不同的,因为它们实际上是包装数组类型的包装类型,用于保存幕后的值.像List< T>这样的东西或C#和Java中的ArrayList.但是在这种情况下使用new是不够的,因为底层数组应该初始化为空数组才能使用.因为您无法在类型数组的字段中添加或删除nil(或null).因此,他们提供了一个make()方法来帮助您初始化切片等.

那么当你在切片上使用new()时会发生什么呢?简单:由于底层数组将为nil,因此切片将指向nil数组.

所以new()看起来像下面的C#/ Java代码:

public class Person{   public string name;   public int Age;   public Address HomeAddress;}var person = new Person();Console.Writeline(person.name); // ""Console.Writeline(person.Age); // 0Console.Writeline(person.HomeAddress); // null

另一方面,make()对于切片,贴图和通道看起来像这样:

public class PersonList{   // We are initializing the array so that we can use it.   // Its capacity can increase.   private Person[] _personList = new Person[100];   public voID Add(Person p){}   public voID Remove(Person p){}   public Person Get(int index){}}

初始化与归零

简单来说,归零是一种初始化形式.起初,我认为他们不同,但事实并非如此.初始化是一个更通用的术语,而如果将结构或变量的字段(属性等)设置为其默认类型,如0,nil,“”,false等,则称为归零.但是,您可以使用Composite Literals,例如hello:= Hello {name =“world”},这类似于C#中的var hello = new Hello(){name =“World”},然后初始化Hello对象将名称字段设置为world.

在C#中,当你说新的List< string>()时,[底层数组字段被初始化为一个新数组],而make)在幕后执行类似的 *** 作,但是作为语言构造(用语言构建)本身):

(http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646):

所以new会归零并返回指针.而make()将基础数组初始化为具有每个元素的默认值的数组,并返回值本身而不是指针.

总结

以上是内存溢出为你收集整理的初始化和归零之间的区别,以及GoLang中的new()和make()全部内容,希望文章能够帮你解决初始化和归零之间的区别,以及GoLang中的new()和make()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1294175.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存