學習過Python或者java的朋友,都會習慣裏面的類,而Golang中是沒有類的概念,而有相似的概念結構體,結構體是一款功能強大的數據類型,可以簡單的實現其餘語言中類實現的功能,可以序列化json,支持繼承,在繼承時,繼承父結構體的屬性和父結構體的方法。同時結構體也像其餘數據結構和函數同樣,以大寫字母開頭的結構體可以導出本包,應用到其餘包。而當開始定義的一些小寫字母定義的結構體,咱們想要用於其餘包的時候,能夠用工廠函數的方式實現。此外能夠使用工廠函數結合定義某些方法實現面向對象的封裝特性。java
封裝的介紹:json
封裝(encapsulation)就是把抽象出的字段和對字段的操做封裝在一塊兒,數據被保護在內部,程序的其 它包只有經過被受權的操做(方法),才能對字段進行操做。安全
封裝的理解和好處:bash
1) 隱藏實現細節數據結構
2) 能夠對數據進行驗證,保證安全合理(某些字段)ide
如何體現封裝
1) 對結構體中的屬性進行封裝函數
2) 經過方法,包 實現封裝學習
封裝的實現步驟
spa
1) 將結構體、字段(屬性)的首字母小寫(不能導出了,其它包不能使用,相似 private) 對象
2) 給結構體所在包 供一個工廠模式的函數,首字母大寫。相似一個構造函數
3) 供一個首字母大寫的 Set 方法(相似其它語言的 public),用於對屬性判斷並賦值
func (var 結構體類型名) SetXxx(參數列表) (返回值列表) {
//加入數據驗證的業務邏輯
var.字段 = 參數}
4) 供一個首字母大寫的 Get 方法(相似其它語言的 public),用於獲取屬性的值func (var 結構體類型名) GetXxx() {
return var.age; }
特別說明:在 Golang 開發中並無特別強調封裝,這點並不像 Java. 因此 醒學過 java 的朋友, 不用老是用 java 的語法特性來看待 Golang, Golang 自己對面向對象的特性作了簡化的.
相關示例
package person import "fmt" //定義不能導出的結構體 type person struct { Name string age int sal float64 } //定義工廠模式的函數 首字母大寫 相似構造函數 func NewPerson(name string) *person{ return &person{ Name:name, } } //提供一個Set方法 設置年齡 func (user *person) Setage(age int) { if age >0 && age < 150 { user.age = age }else { fmt.Println("年齡數值不對!") } } //獲取年齡 func (user *person) Getage() int{ return user.age } //更改年齡 func (user *person) Updateage(age int) int{ user.age =age return user.age } //更改姓名 func (user *person) Updatename(name string) string{ user.Name=name return user.Name }
在另外一個包中調用person
main ( ) () { person.() fmt.() .() fmt.() .() fmt.() .() fmt.() fmt.() .() fmt.() }
結果