ect1 := new(Rect)
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設、臨清網(wǎng)站維護、網(wǎng)站推廣。
rect2 := Rect{}
rect3 := Rect{0, 0, 100, 200}
rect4 := Rect{width:100, height:200}
注意這幾個變量全部為指向Rect結構的指針(指針變量),因為使用了new()函數(shù)和操作符.而如果使用方法
a := Rect{}
則表示這個是一個Rect{}類型.兩者是不一樣的.參考代碼:
func main() {
rect1 := Rect{0, 0, 100, 200}
rect1.x = 10
a := Rect{}
a.x = 15
fmt.Printf("%v\n%T\n", a, a)
fmt.Printf("%v\n%T\n", rect1, rect1)
}
運行結果為:
{15 0 0 0}
main.Rect
{10 0 100 200}
*main.Rect
new 主要用于結構體的初始化
make用于數(shù)組array,切片slice,協(xié)程chnnel的初始化
例如: users:=make([10]int);
msg:=make(chan int);
new會分配結構空間,并初始化為清空為零,不進一步初始化
new之后需要一個指針來指向這個結構
make會分配結構空間及其附屬空間,并完成其間的指針初始化
make返回這個結構空間,不另外分配一個指針
例子new:
var p *[]int = new([]int)
或
p := new([]int)
以上分配了一個slice結構,但是結構中的應該指向底層數(shù)組的ptr指針為空,故實際不能往這個slice里面存取數(shù)據(jù)
同時分配了一個指針p,也即(在32位系統(tǒng)中)占4個字節(jié)并存放slice結構的地址
例子make:
var v []int = make([]int, 0)
v := make([]int, 0)
以上分配了一個slice結構,且結構中的應該指向底層數(shù)組的ptr指針已經(jīng)指向了某個底層數(shù)組,這個底層數(shù)組應該已經(jīng)分配了,故這個slice已經(jīng)可以使用了
注意v就是這個slice結構,而不是一個指向slice的指針
上述僅是示例,一般使用時都會明確長度和容量:v := make([]int, 10, 50)
結論:
由上可見,用new來分配slice的意義不大,因為沒有恰當?shù)某跏蓟?,無法直接使用
有附帶空間的結構,使用make來初始化,可以完成內(nèi)部指針初始化,其后可以立即使用
new()
這是一個用來分配內(nèi)存的內(nèi)置函數(shù),它的第一個參數(shù)是一個類型,不是一個值,它的返回值是一個指向新分配的 t 類型的零值的指針。
在golang的代碼定義如下:
func new(t Type) *Type
strut{}
直接使用struct{} 來初始化strut時,返回的是一個struct類型的值,而不是指針兩者是不一樣的
兩者對比代碼如下:
type Student struct{
id int
name string
}
func main(){
var s_1 *Student = new(Student)
s_1.id = 100
s_1.name = "cat"
var s_2 Student = Student{id:1,name:"tom"}
fmt.Println(s_1,s_2)
}
輸出結果:
{100 cat} {1 tom}
從上面代碼的聲明和打印的結果中就可以看出 s_1 的類型為指針,s_2 為一個Student類型
現(xiàn)在有個結構體如下定義:
我們需要初始化結構體,如果是其他語言,函數(shù)支持默認參數(shù):
但是,go語言函數(shù)不支持默認參數(shù),同時即使go語言支持默認參數(shù),但是如果配置項過多,那么每一個配置項都得寫一個默認參數(shù),也不現(xiàn)實。
那么,在go語言中,我們怎么優(yōu)雅的給其初始化呢,這時,就需要利用選項模式了(option)。
首先,我們定義一個option函數(shù)類型:
它接收一個參數(shù): *Server 。
然后定義一個 NewServer 函數(shù),它接收一個 Option類型的不定參數(shù):
最后,再直接定義一系列返回 Option的函數(shù)
使用時,直接: