亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GoLang 中初始化和歸零以及 new() 和 make() 之間的區別

GoLang 中初始化和歸零以及 new() 和 make() 之間的區別

Go
楊__羊羊 2022-01-10 16:27:44
我來自 C# 背景,我對 GoLang 初始化和歸零定義的方式有點困惑。我想你能猜到這混亂產生make()和new()功能定位。當這些方法運行時,我應該期待內部發生什么?當初始化和歸零發生時會發生什么?我知道init()GoLang中有一個用于初始化包的函數。但我認為它與此不同。無論如何,它們之間有什么區別?更新我回答了我自己的問題,請檢查它以查看我的答案。
查看完整描述

3 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

我想我已經想通了,并決定分享我到目前為止的想法。


make() 對比 new()

我想我現在明白之間的差別make()和new()。起初,這有點令人困惑,但我得到了:


new就像new在 C# 或 Java 中一樣,但由于 Go 中沒有構造函數,所有字段(如 Java 和 C# 術語中的)都將歸零。歸零意味著更像是默認字段。因此,如果字段類型是int,那么它將是0,或者如果它是 a struct,那么對于類型nil,它將默認為, 和。當只有無參數構造函數可用并且您沒有手動將成員設置為其他內容時,它實際上類似于 C# 和 Java。""string


但是,像map,slice和channels這樣的類型是不同的。它們是不同的,因為它們實際上是包裝器類型,它們包裝了一個數組類型來保存幕后的值。所以像List<T>或ArrayList在 C# 和 Java 中的東西。但是new在這種情況下使用是不夠的,因為底層數組應該被初始化為一個空數組才能使用。因為您不能從nil(或null)類型的數組字段中添加或刪除。因此,他們提供了一種make()方法來幫助您進行初始化slices等。


new()例如,當您使用over slices時會發生什么?簡單:由于底層數組是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); // 0

Console.WriteLine(person.HomeAddress); // null

make(),在另一方面,是這樣的slice,map和channelS:


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等等,那么這被稱為零位調整。但是,你可以,例如,使用復合字面一樣hello := Hello{name="world"},這類似于var hello = new Hello() {Name = "World"}在C#中,那么你初始化Hello一個對象name字段設置為world。


在 C# 中,當您說時new List<string>(),[底層數組字段被初始化為一個新數組],并且make)在幕后執行類似的操作,但作為一種語言構造(內置于語言本身):


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

http://img1.sycdn.imooc.com//61dbee2900018a0807000392.jpg

new歸零也是如此,并返回一個指針。而make()將底層數組初始化為每個元素都有默認值的數組,并返回值本身而不是指針。


查看完整回答
反對 回復 2022-01-10
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

new 返回指向該類型的指針,這是一步返回指向本機類型(又名 int、float、complex)的指針的唯一方法:


intPtr := new(int)

// or

var i int

intPtr := &i

make 用于初始化通道、切片和映射。


所有變量在創建時都歸零,無論您如何創建它們。


關于 make 的規范:https : //golang.org/ref/spec#Making_slices_maps_and_channels


關于零值的規范:https : //golang.org/ref/spec#The_zero_value


查看完整回答
反對 回復 2022-01-10
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

new(T)為 T 類型的新項目分配零存儲并返回其地址,*T 類型的值:它返回指向新分配的 T 類型零值的指針,準備使用;它適用于數組和結構等值類型。相當于 &T{ }


make(T)返回 T 類型的初始化值;它僅適用于 3 種內置引用類型:切片、映射和通道。


var p *[]int = new([]int) // *p == nil; with len and cap 0

//or    

p := new([]int)


var v []int = make([]int, 10, 50)

//or

v := make([]int, 10, 50)


//This allocates an array of 50 ints and then creates a slice v with length 10 and capacity 50 pointing

//to the first 10 elements of the array


查看完整回答
反對 回復 2022-01-10
  • 3 回答
  • 0 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號