1. 程式人生 > >Go語言中new()和 make()的區別詳解

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言中stringsstrconv包示例代碼

dex 實現 light div 重復字符 轉換 trim 漢字 大小寫 1.strings使用 前綴和後綴 HasPrefix判斷字符串s是否以prefix開頭: 示例: package main import ( "fmt" "strings"

GO言中printfprintln的區別

作為兩種輸出方法,兩者之間除了換行之外還有其他區別。 Println :可以打印出字串,和變數 Printf : 只可以打印出格式化的字串,可以輸出字串型別的變數 //例如: a := 10 p

GO 記憶體分配newmake區別

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言中PrintfPrintln

 1. Printf   如果是空字串,輸出了空字串的 雙引號 "" 例如 func variableZeroValue(){ var a int var s string fmt.Printf("%d %q\n", a, s) } 輸出結果

MySQL存儲引擎中的MyISAMInnoDB區別

訪問 過程 包含 lte 處理機制 comm 用戶 isam log MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不

MyISAMInnoDB區別

sam 是什麽 註意 高速 dump 在操作 必須 index 自己 MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不

C言中static關鍵字的作用

在C語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。 (1)先來介紹它的第一條也是最重要的一條:隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,一個是a.c,另一個是

MySQL儲存引擎中的MyISAMInnoDB區別

在使用MySQL的過程中對MyISAM和InnoDB這兩個概念存在了些疑問,到底兩者引擎有何分別一直是存在我心中的疑問。為了解開這個謎題,搜尋了網路,找到了如下資訊: MyISAM是MySQL的預設資料庫引擎(5.5版之前),由早期的ISAM(Indexed Sequent

Statement、PreparedStatementCallableStatement區別

1.Statement、PreparedStatement和CallableStatement都是介面(interface)。 2.Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStateme

MySQL儲存引擎:MyISAMInnoDB區別

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,VectorLinkedList區別

一、ArrayList ArrayList是一個可以處理變長陣列的型別,這裡不侷限於“數”組,ArrayList是一個泛型類,可以存放任意型別的物件。顧名思義,ArrayList是一個數組列表,因此其內部是使用一個數組來存放物件的,因為Object是一切型別的父類,因而ArrayList內部是有一個Obje

RHEL6啟動服務流程servicechkconfig區別

       在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 這樣