前面介紹了Golang的重要特性:Interface接口。不清楚的同學一定要把這個概念搞懂,或者看看我之前的文章:
大家都知道 golang 語法中主要的是結構體和函數,並沒有類的概念,那麼如果想讓golang搞一搞面向對象編程該怎麼實現呢?
下面就圍繞著 封裝、繼承、多態和抽象這4個面向對象編程的基本特徵說一說Golang語言是如何實現面向對象編程。
GO語言中的面向對象
其實GO並不是一個純面向對象編程語言。它沒有提供類(class)這個關鍵字,只提供了結構體(struct)類型。
java或者C# 裡面,結構體(struct)是不能有成員函數的。然而,Go語言中的結構體(struct)可以有"成員函數"。方法可以被添加到結構體中,類似於類的實現。
所以,我個人覺得Go 語言在的面向對象其實更簡單,也更容易理解。
如何實現面向對象
學過java或C# 的人應該都知道,面向對象的三個基本特徵:封裝、繼承和多態。他們的定義我這裡就不細說了。下面,就直接看看 go 語言下的面向對象是怎樣實現的吧。
1. 封裝特性
Golang區分公有屬性和私有屬性的機制就是方法或屬性是否首字母大寫,如果方法的首字母是大寫的說明是公有方法,可以被其他方法調用,如果首字母小寫則是私有方法,不能被調用。
下面我們定義一個Person類型如下:
<code>package main
import "fmt"
type Person struct {
name string
}
func (person *Person) setName(name string) {
person.name = name
}
func (person *Person) GetInfo() {
fmt.Println(person.name)
}
func main() {
p := Person{"zhangsan"}
p.setName("lisi")
p.GetInfo()
}/<code>
2. 繼承特性
GO語言的繼承方式採用的是匿名組合的方式:Woman 結構體中包含匿名字段Person,那麼Person中的屬性也就屬於Woman對象。
<code>package main
import "fmt"
type Person struct {
name string
}
type Woman struct {
Person
sex string
}
func main() {
woman := Woman{Person{"wangwu"}, "女"}
fmt.Println(woman.name)
fmt.Println(woman.sex)
}/<code>
3. 多態特性
基類指針可以指向任意派生類的對象,並在運行時綁定最終調用的方法的過程被稱為多態。多態是運行時特性,而繼承則是編譯時特徵,也就是說,繼承關係在編譯時就已經確定了,而多態則可以實現運行時的動態綁定。
下面這個例子:Woman和Man都是實現了吃東西的行為。所以,我們可以把它們共同的方法提煉出來定義一個抽象的Eater 接口:
<code>package main
import "fmt"
type Eater interface {
Eat()
}
type Man struct {
}
type Woman struct {
}
func (man *Man) Eat() {
fmt.Println("Man Eat")
}
func (woman *Woman) Eat() {
fmt.Println("Woman Eat")
}
func main() {
var e Eater
woman := Woman{}
man := Man{}
e = &woman
e.Eat()
e = &man
e.Eat()
}/<code>
最後
以上,就把Go語言如何實現面向對象的簡單介紹了一下,其實跟java和C# 等也都差不多,大家可以比較著來看。總結的來說就是:Go沒有類,而是松耦合的類型、方法對接口的實現。
閱讀更多 章為忠學架構 的文章