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

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

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
- 3 回答
- 0 關注
- 189 瀏覽
添加回答
舉報