new 主要用于結構體的初始化
創新互聯:成立與2013年為各行業開拓出企業自己的“網站建設”服務,為成百上千家公司企業提供了專業的網站制作、成都網站制作、網頁設計和網站推廣服務, 按需規劃網站由設計師親自精心設計,設計的效果完全按照客戶的要求,并適當的提出合理的建議,擁有的視覺效果,策劃師分析客戶的同行競爭對手,根據客戶的實際情況給出合理的網站構架,制作客戶同行業具有領先地位的。
make用于數組array,切片slice,協程chnnel的初始化
例如: users:=make([10]int);
msg:=make(chan int);
new會分配結構空間,并初始化為清空為零,不進一步初始化
new之后需要一個指針來指向這個結構
make會分配結構空間及其附屬空間,并完成其間的指針初始化
make返回這個結構空間,不另外分配一個指針
例子new:
var p *[]int = new([]int)
或
p := new([]int)
以上分配了一個slice結構,但是結構中的應該指向底層數組的ptr指針為空,故實際不能往這個slice里面存取數據
同時分配了一個指針p,也即(在32位系統中)占4個字節并存放slice結構的地址
例子make:
var v []int = make([]int, 0)
v := make([]int, 0)
以上分配了一個slice結構,且結構中的應該指向底層數組的ptr指針已經指向了某個底層數組,這個底層數組應該已經分配了,故這個slice已經可以使用了
注意v就是這個slice結構,而不是一個指向slice的指針
上述僅是示例,一般使用時都會明確長度和容量:v := make([]int, 10, 50)
結論:
由上可見,用new來分配slice的意義不大,因為沒有恰當的初始化,無法直接使用
有附帶空間的結構,使用make來初始化,可以完成內部指針初始化,其后可以立即使用
現在有個結構體如下定義:
我們需要初始化結構體,如果是其他語言,函數支持默認參數:
但是,go語言函數不支持默認參數,同時即使go語言支持默認參數,但是如果配置項過多,那么每一個配置項都得寫一個默認參數,也不現實。
那么,在go語言中,我們怎么優雅的給其初始化呢,這時,就需要利用選項模式了(option)。
首先,我們定義一個option函數類型:
它接收一個參數: *Server 。
然后定義一個 NewServer 函數,它接收一個 Option類型的不定參數:
最后,再直接定義一系列返回 Option的函數
使用時,直接:
obj := new(StructName) ?初始化Struct中的所有屬性都是零值,返回的是Struct指針,效果與StructName{}一致。
obj :=?StructName{Prop1:xx, Prop2:yy,...} ,?初始化Struct中的所有屬性,同時對指定屬性賦值,返回的是Struct值對象,作為參數傳遞時,其屬性不會被修改。
obj := StructName{Prop1:xx, Prop2:yy,...} 同上,返回的是Struct值對象的指針,作為參數傳遞時,其屬性可以被修改。
后面兩種使用方法更加靈活。
標題名稱:go語言結構初始化 go 初始化結構體
瀏覽路徑:http://vcdvsql.cn/article44/ddcsehe.html
成都網站建設公司_創新互聯,為您提供微信公眾號、動態網站、虛擬主機、營銷型網站建設、服務器托管、關鍵詞優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯