Golang 內置函數 new 和 make 的區別

                                           

Go 語言中 new 和 make 都是內置函數,用於內存的分配,本文主要簡述二者使用上的異同與特性。spring

new

舉個例子:sql

func main() {  var i *int  *i = 1  fmt.Println(*i)}

上面的程序並不會打印1,而會拋 panic 異常,由於i是一個引用類型,須要給它分配內存空間,通俗來講就是指針(內存地址)須要指向一片內存空間纔有意義。
mybatis

爲 i 分配內存:架構

func main() {  var i *int  i = new(int)  *i = 1  fmt.Println(*i)}

用 new 內置函數爲 i 分配內存空間,並返回該內存空間的地址,即指針,new 函數格式以下:
app

func new(Type) *Type

可知,new 爲每一個類型分配一片內存空間,初始化爲 0 並返回該內存空間的地址。
分佈式

new 的內存分配示意圖:圖片ide

其實要說明一點的就是,new 不經常使用,咱們經常會經過結構體的字面量達到 new 的效果,並且這樣寫也比較優雅:函數

man := &People{Name: "zhangchenghui", Age: 18, Sex: "男"}

make

make 也是分配內存分配,可是僅限 chan、map、slice 的內存建立,並返回其類型的引用,這一點很重要, chan、map、slice 其自己已是引用類型了,因此make不須要再返回其指針,引用類型的本質就是指針!例如:源碼分析

type i *int;

如上,i 就是一個自定義的引用類型,其類型是一個 int 類型的指針。
ui

Make 內置函數格式:

func make(t Type, size ...IntegerType) Type

make 的內存分配示意圖:圖片


近期熱文

RocketMQ爲何要保證訂閱關係的一致性?

分佈式事務中間件Seata的設計原理

我對支付平臺架構設計的一些思考

Go Modules踩坑總結

聊聊Tomcat的架構設計

從源碼的角度解析線程池運行原理

RocketMQ消息發送的高可用設計

深度解析RocketMQ Topic的建立機制

RocketMQ源碼分析之路由中心

mybatis-plus源碼分析之sql注入器

鍾同窗,this is for you!

Mybatis-spring源碼分析之註冊Mapper Bean

基於Jenkins Pipeline自動化部署

Dubbo服務暴露之註冊地址和端口

Dubbo全鏈路追蹤日誌的實現

https://mp.weixin.qq.com/s/_FTH5GeWEo8IV9oOiqD3MA

相關文章
相關標籤/搜索