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 匿名欄位來做出更多元的應用。最後,雖然沒有像其他程式語言,預設就攜帶著豐富的物件導向結構,但是在實際開發需求中,還是可以透過這樣的功能堆疊,進行開發。