Go 結構體和方法

結構體

結構體是用戶自定義的類型,讓業務聲明更緊湊。編程

type Employee struct{
	firstName string
	lastName string
	age           int
}

賦值:編程語言

emp1 := Employee{
	firstName : 「Sam」,
	age : 25,
	lastName : 「Anderson」,
}

或者:函數

emp2 := Employee{「Thomas」, 29, 「Paul」} // 這種狀況下須要保持和結構體中順序同樣

訪問結構體字段

經過操做符 . 進行字段訪問。指針

emp1.firstName
emp1.lastname
emp1.age

經過這種方式對結構體賦值:code

var emp2 Employee // 建立零值struct,都是默認值
emp2.firstName = 「Jack」
emp2.lastName = 「Adams」

結構體指針

emp3 := &Employee{「sam」,」anderson」,55} // 建立指向結構體指針
(*emp3).firstName // 經過*反解獲取指針指向變量,獲取變量值

或者採用emp3.firstName方式顯示反解。對象

導出結構體

若是結構體名稱以大寫字母開頭,說明它是其餘能夠訪問導出類型,結構體中字段首字母大寫,說明它能夠被其餘包訪問到。string

好比咱們能夠在src目錄下建立名字structs的文件夾,在裏面建立結構體源文件。面向對象編程

結構體相等

結構體是值類型,若是兩個結構體每一個字段都是可比較的(int,string),且變量字段相等,則說明兩個結構體相等。ast

若是結構體中包含不可比較字段(map),則結構體是不可比較的。變量

方法

方法就是一個函數,區別是func和方法名之間加入一個接收器類型,接收器能夠是結構體類型或者非結構體類型,能夠在方法內部訪問這個接收器。

func (t Type) methodName(parameter list){
}

// 好比

type Employee struct{
	name string
	salary int
	currency string
}

func (e Employee) displaySalary(){
}

// 接收器調用
e.displaySalary()

方法和函數的區別

  • Go不是純粹的面向對象編程語言,Go不支持類,因而基於類型的方法能夠實現相似於類行爲。
  • 相同名字的方法能夠定義在不一樣的類型上,相同名字的函數是不被容許的。

指針接收器

上面例子都是基於值的接收器,指針接收器和值接收器的區別在於,指針接收器的方法內部的改變對於調用者是可見的,這一直也是指針的特色。

在Go中,若是變量是e *Employee的指針,可直接使用e.屬性,直接反解。

什麼時候使用值接收器,什麼時候使用指針接收器

指針接收器使用在:對方法內部接收器所作改變須要對調用者可見時。

通常是如下場景:

  • 當拷貝一個結構體代價過於昂貴時,好比結構體有不少字段。這時使用指針接收器,結構體不會被拷貝,只會傳遞一個指針到方法內部使用。
  • 其餘狀況值接收器和指針接收器能夠共同使用。
相關文章
相關標籤/搜索