Golang中--面向對象封裝

    學習過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 自己對面向對象的特性作了簡化的.

相關示例

image.png

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.()



}


結果

image.png

相關文章
相關標籤/搜索