Go語言中new()和 make()的區別詳解
概述
Go 語言中的 new 和 make 一直是新手比較容易混淆的東西,咋一看很相似。不過解釋兩者之間的不同也非常容易。
new 的主要特性
複製程式碼程式碼如下:func new(Type) *Type
官方文件對於它的描述是:
複製程式碼程式碼如下:內建函式 new 用來分配記憶體,它的第一個引數是一個型別,不是一個值,它的返回值是一個指向新分配型別零值的指標
根據這段描述,我們可以自己實現一個類似 new 的功能:
func newInt() *int {
var i int
return &i
}
someInt := newInt()
我們這個函式的功能跟 someInt := new(int) 一模一樣。所以在我們自己定義 new 開頭的函式時,出於約定也應該返回型別的指標。
make 的主要特性
複製程式碼程式碼如下:func make(Type, size IntegerType) Type
官方文件對於它的描述是:
內建函式 make 用來為 slice,map 或 chan 型別分配記憶體和初始化一個物件(注意:只能用在這三種類型上),跟 new 類似,第一個引數也是一個型別而不是一個值,跟 new 不同的是,make 返回型別的引用而不是指標,而返回值也依賴於具體傳入的型別,具體說明如下:
Slice: 第二個引數 size 指定了它的長度,它的容量和長度相同。
你可以傳入第三個引數來指定不同的容量值,但必須不能比長度值小。
比如 make([]int, 0, 10)
Map: 根據 size 大小來初始化分配記憶體,不過分配後的 map 長度為 0,如果 size 被忽略了,那麼會在初始化分配記憶體時分配一個小尺寸的記憶體
Channel: 管道緩衝區依據緩衝區容量被初始化。如果容量為 0 或者忽略容量,管道是沒有緩衝區的
總結
new 的作用是初始化一個指向型別的指標(*T),make 的作用是為 slice,map 或 chan 初始化並返回引用(T)。
相關推薦
Go語言中new()和 make()的區別詳解
概述Go 語言中的 new 和 make 一直是新手比較容易混淆的東西,咋一看很相似。不過解釋兩者之間的不同也非常容易。new 的主要特性複製程式碼程式碼如下:func new(Type) *Type官方文件對於它的描述是:複製程式碼程式碼如下:內建函式 new 用來分配記憶
(Go)07.Go語言中strings和strconv包示例代碼詳解
dex 實現 light div 重復字符 轉換 trim 漢字 大小寫 1.strings使用 前綴和後綴 HasPrefix判斷字符串s是否以prefix開頭: 示例: package main import ( "fmt" "strings"
GO語言中printf和println的區別
作為兩種輸出方法,兩者之間除了換行之外還有其他區別。 Println :可以打印出字串,和變數 Printf : 只可以打印出格式化的字串,可以輸出字串型別的變數 //例如: a := 10 p
GO 記憶體分配new和make的區別
func new func new(Type) *Type The new built-in function allocates memory. The first argument is a type, not a value, and the value retu
GO中的 new 和 make 的區別
Go 語言中的 new 和 make 一直是新手比較容易混淆的東西,咋一看很相似。不過解釋兩者之間的不同也非常容易。 他們所做的事情,和應用的型別也不相同。 二者都是用來分配空間。 new 函式 new 是內建函式,函式原型為 func new
Go語言中Printf和Println
1. Printf 如果是空字串,輸出了空字串的 雙引號 "" 例如 func variableZeroValue(){ var a int var s string fmt.Printf("%d %q\n", a, s) } 輸出結果
MySQL存儲引擎中的MyISAM和InnoDB區別詳解
訪問 過程 包含 lte 處理機制 comm 用戶 isam log MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不
MyISAM和InnoDB區別詳解
sam 是什麽 註意 高速 dump 在操作 必須 index 自己 MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不
C語言中static關鍵字的作用詳解
在C語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。 (1)先來介紹它的第一條也是最重要的一條:隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,一個是a.c,另一個是
MySQL儲存引擎中的MyISAM和InnoDB區別詳解
在使用MySQL的過程中對MyISAM和InnoDB這兩個概念存在了些疑問,到底兩者引擎有何分別一直是存在我心中的疑問。為了解開這個謎題,搜尋了網路,找到了如下資訊: MyISAM是MySQL的預設資料庫引擎(5.5版之前),由早期的ISAM(Indexed Sequent
Statement、PreparedStatement和CallableStatement區別詳解
1.Statement、PreparedStatement和CallableStatement都是介面(interface)。 2.Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStateme
MySQL儲存引擎:MyISAM和InnoDB區別詳解
1、MyISAM和InnoDB區別 1.1 區別 InnoDB MyISAM 構造 由.frm檔案、表空間(分為獨立表空間或者共享表空間)和日誌檔案(redo log)組成。 MyIS
【字串】字元陣列和字串區別詳解
C 語言中並不存在字串這個資料型別,而是使用字元陣列來儲存字串。那麼,字元陣列就一定是字串嗎? 對於這個問題,大多教科書中的回答是“是”。其實不然,字元陣列和字串是完全不相同的兩個概念,千萬不要混淆。分析如下所示的示例程式碼。 1 #include <stdio.h> 2 #incl
R語言中Legend 函式的引數詳解
legend(x, y = NULL, legend, fill = NULL, col = par("col"), border = "black", lty, lwd, pch,
ArrayList,Vector和LinkedList區別詳解
一、ArrayList ArrayList是一個可以處理變長陣列的型別,這裡不侷限於“數”組,ArrayList是一個泛型類,可以存放任意型別的物件。顧名思義,ArrayList是一個數組列表,因此其內部是使用一個數組來存放物件的,因為Object是一切型別的父類,因而ArrayList內部是有一個Obje
RHEL6啟動服務流程service和chkconfig區別詳解
在RHEL6系統中是利用service和chkconfig來管理服務的,而在RHEL7中則是用systemctl來管理服務,RHEL7利用systemctl管理服務大部分都是呼叫的以前RHEL6中的啟動指令碼,感覺就是把RHLE6裡的東西封裝了一下,沒多大實質的
C語言中的system函式引數詳解
http://blog.csdn.net/pipisorry/article/details/33024727 函式名: system 功 能: 發出一個DOS命令 用 法: int system(char *command); system函式已
C++中的 .h 和 .cpp 區別詳解
在C++程式設計過程中,隨著專案的越來越大,程式碼也會越來越多,並且難以管理和分析。於是,在C++中就要分出了頭(.h)檔案和實現(.cpp)檔案,並且也有了Package的概念。 對於以C起步,C#作為“母語”的我剛開始跟著導師學習C++對這方面還是感到很模糊。雖然我
mybatis中#{}和${}的區別詳解
一:在mybatis中最主要的一個特性就是動態sql: 1、 程式設計師通過直接編寫SQL語句,可以直接對SQL進行效能的優化; 2、 學習門檻低,學習成本低。只要有SQL基礎,就可以學習mybatis,而且很容易上手;
Go語言程式檢視和診斷工具詳解
想必Java 的開發者沒有不知道或者沒用過 jps 這個命令的,這個命令是用來在主機上檢視有哪些 Java 程式在執行的。 我剛用 Go 語言程式的時候也很苦惱,我部署在公司伺服器上的 Go 程式,其他的同事由於不清楚就經常找不到。 那麼 Go 語言有沒有像 jps 這樣