Golang - 物件導向

GoLang - 物件導向

在這幾篇,會以 Go 語言的入門基礎進行逐步說明,本篇針對物件導向進行說明

在 Go 語言沒有像其他語言一樣有明確定義物件導向(Class, object, instance…) 封裝層,並且沒有 this, self 這種可以代表物件本身的屬性,以及沒有靜態屬性 (那麼本篇結束?)

當然,答案其實是不盡然,在 Go 雖然沒有其他語言有明確定義物件導向,但其實一樣也可實作出物件導向結構。

由於在實作方式會和其他語言有所不同,這部分會讓多數人搞混,就連官方看待 “Go是否為物件導向語言?” 問題,他們回答的是 “yes and no”,以含糊的方式回答。因此,當你進入 Go 的領域時,請放下過去 OO 包袱,重新在這裡學習 Go 語言的物件導向結構。

struct:

在開始說明 struct 在實作物件導向的用法前,先說明他的基本結構,基本上在宣告一個 struct 時,可以同時宣告他的屬性,例如:

struct 命名,若字首大寫則為 public 權限,如果小寫則只在自己的 package 內可以訪問。

type User struct{
	name string
	age int
	phone int
}

例如:

type User struct {
  name  string
  age   int
  phone string
}

func main() {

  var user1 User
  user1.name = "Adam"
  user1.age = 10
  user1.phone = "0912345678"

  fmt.Println(user1)
}
//output {Adam 10 0912345678}

另外,也可直接宣告 struct 預設值

type User struct {
  name  string
  age   int
  phone string
}

func main() {

  user1 := User{"Adam", 10, "0912345678"}

  fmt.Println(user1)
}
//output {Adam 10 0912345678}

這裡不詳細說明 struct 的各種用法,後續再針對這部份進行介紹,接著來說明如何在 method 如何來結合 struct與func做出物件導向。

method:

struct 的結構可以在 Go 語言中實作 Class 以及可定義屬性,而 函數 則可實作方法。並且 func 會各自獨立存在。

而 method 可以將 struct 與 func 建立關聯,他的基本結構為:

func (receiverParam ReceiverType) funcName(param paramType) (resultsType) {

}

在下方示範一個例子, user 表示為一般用戶,member 表示為付費會員,在這裡透過 methods 各別定義出兩者的 struct與 func,

func 可以看到,帶入的參數會指定是什麼 struct。

在這裡例子,兩個 methods 名稱都一樣 (都叫 data()) ,但是會依照收的 struct 不同來做區分:

type User struct {
  name  string
  age   int
  phone string
}

func (tg User) data() string {
  return "this is user:" + tg.name
}

type Member struct {
  name    string
  balance int
  age     int
  phone   string
}

func (tg Member) data() string {
  return "this is member:" + tg.name
}

func main() {

  user1 := User{"Adam", 10, "0912345678"}
  member1 := Member{"Brown", 11, 233, "0912345679"}

  fmt.Println(user1.data()) //output this is user:Adam
  fmt.Println(member1.data()) //output this is member:Brown

}

當然,這裡透過一個簡單的例子說明,希望對於學習 Go 語言的物件導向應用能有所幫助。在 Go 語言可以做出非常簡單優雅的物件導向架構。更進階的,可以透過 struct 匿名欄位來做出更多元的應用。最後,雖然沒有像其他程式語言,預設就攜帶著豐富的物件導向結構,但是在實際開發需求中,還是可以透過這樣的功能堆疊,進行開發。