Golang 語(yǔ)言是面向?qū)ο缶幊田L(fēng)格的編程語(yǔ)言嗎?
01介紹
Golang 語(yǔ)言是面向?qū)ο笳Z(yǔ)言嗎?Golang 語(yǔ)言官方的回答是 Yes and no。什么意思呢?Golang 語(yǔ)言是面向?qū)ο笳Z(yǔ)言,Golang 語(yǔ)言也不是面向?qū)ο笳Z(yǔ)言。
雖然 Golang 語(yǔ)言有類(lèi)(struct)和方法(method),支持面向?qū)ο蟮木幊田L(fēng)格,我們可以使用 Golang 語(yǔ)言的 struct 實(shí)現(xiàn)面向?qū)ο蟮姆庋b特性,但是 Golang 語(yǔ)言沒(méi)有面向?qū)ο蟮睦^承特性,Golang 語(yǔ)言可以使用組合實(shí)現(xiàn)“繼承”。
Golang 語(yǔ)言中的 interface 也和其他語(yǔ)言中的接口實(shí)現(xiàn)方式不同,Golang 語(yǔ)言中的接口實(shí)現(xiàn)方式是鴨子類(lèi)型(duck type)。
封裝,繼承和多態(tài)是區(qū)分編程語(yǔ)言是否是面向?qū)ο缶幊陶Z(yǔ)言的三個(gè)重要特性。本文我們通過(guò)一些簡(jiǎn)單易懂的示例代碼介紹一下 Golang 語(yǔ)言的面向?qū)ο缶幊田L(fēng)格。
02封裝
面向?qū)ο蟮姆庋b特性,其他面向?qū)ο笳Z(yǔ)言是使用 class 定義一個(gè)類(lèi),然后在類(lèi)中定義屬性和方法。在 Golang 語(yǔ)言中,沒(méi)有類(lèi) class 的概念,它是使用結(jié)構(gòu)體 struct 替代類(lèi) class,struct 中可以包含零個(gè)或多個(gè)變量,然后可以使用 method 和 struct 綁定實(shí)現(xiàn)方法,用來(lái)替代其他語(yǔ)言中 class 中的屬性和方法。
關(guān)于 method 綁定的 struct(接收者)是值類(lèi)型和指針類(lèi)型之間的區(qū)別,我們?cè)谥暗奈恼轮薪榻B過(guò),在此不再贅述。
- type Employee struct {
- Name string
- Gender string
- Age uint8
- Salary uint
- }
- func (e Employee) Information () string {
- return fmt.Sprintf("Name:%s Gender:%s Age:%d Salary:%d", e.Name, e.Gender, e.Age, e.Salary)
- }
閱讀上面這段代碼,我們定義了一個(gè)命名是 Employee 的 struct,包含 4 個(gè)成員變量,并且定義一個(gè) Information 方法,綁定到命名是 Employee 的 struct 上。
03繼承 組合
面向?qū)ο蟮睦^承特性,在 Golang 語(yǔ)言中并不支持,但是可以使用組合的方式實(shí)現(xiàn)“繼承”。
- type User struct {
- ID uint64
- Name string
- Score uint64
- }
- type Member struct {
- User
- Level uint8
- }
- func (u User) Information () string {
- return fmt.Sprintf("ID:%d Name:%s Score:%d", u.ID, u.Name, u.Score)
- }
閱讀上面這段代碼,我們定義了一個(gè)命名為 User 的 struct,它包含 3 個(gè)成員變量,然后定一個(gè)一個(gè)命名為 Member 的 struct,它包含 2 個(gè)成員變量,其中一個(gè)成員變量是嵌入的 User,通過(guò)組合的方式,類(lèi)型 Member 就“繼承”了類(lèi)型 User 的屬性(成員變量)和方法。
04多態(tài)
Golang 語(yǔ)言中也有接口 interface,它的 interface 的實(shí)現(xiàn)方式是 duck type,它不需要像其他面向?qū)ο缶幊陶Z(yǔ)言那樣,使用關(guān)鍵字 implements 顯式聲明,而是只需要類(lèi)型通過(guò)實(shí)現(xiàn)接口中的所有方法來(lái)實(shí)現(xiàn)接口。
- type MemberRights interface {
- Information () string
- }
- type BronzeMember struct {
- Discount uint8
- }
- type SilverMember struct {
- Discount uint8
- }
- type GoldMember struct {
- Discount uint8
- }
- func (b *BronzeMember) Information () string {
- return fmt.Sprintf("Discount:%d", b.Discount)
- }
- func (s *SilverMember) Information () string {
- return fmt.Sprintf("Discount:%d", s.Discount)
- }
- func (g *GoldMember) Information () string {
- return fmt.Sprintf("Discount:%d", g.Discount)
- }
- func Price (m MemberRights) {
- fmt.Println(m.Information())
- }
- func main () {
- b := &BronzeMember{Discount: 9}
- Price(b)
- s := &SilverMember{8}
- Price(s)
- g := new(GoldMember)
- g.Discount = 7
- Price(g)
- }
閱讀上面這段代碼,我們定義一個(gè)命名為 MemberRights 的接口,包含一個(gè)方法 Information () string,然后定義了三個(gè) struct,命名分別是 BronzeMember,SilverMember 和 GoldMember,并且實(shí)現(xiàn)了 Information () string 方法。
我們還定義了一個(gè)函數(shù) Price,接收一個(gè) MemberRights 接口類(lèi)型的參數(shù)。我們?cè)?main 函數(shù)中調(diào)用 Price 函數(shù),并分別傳入我們定義的三個(gè)實(shí)現(xiàn)了 MemberRights 接口包含的方法 Information () string 的變量作為 Price 函數(shù)的參數(shù)。因?yàn)?Price 函數(shù)的參數(shù)是接口類(lèi)型,所以我們需要傳入指針類(lèi)型的變量,我們還特意通過(guò)三種不同的方式聲明指針類(lèi)型的變量。
05總結(jié)
本文我們介紹了 Golang 語(yǔ)言是否是面向?qū)ο缶幊田L(fēng)格的語(yǔ)言,并給出了 Golang 語(yǔ)言官方的回答和解釋。然后使用示例代碼介紹了 Golang 語(yǔ)言的面向?qū)ο缶幊田L(fēng)格。
需要注意的是 Golang 語(yǔ)言中使用命名首字母大小寫(xiě)區(qū)分私有和公有,私有和公有屬性在 Golang 語(yǔ)言中也叫可導(dǎo)出和非可導(dǎo)出。
本文轉(zhuǎn)載自微信公眾號(hào)「Golang語(yǔ)言開(kāi)發(fā)?!?,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Golang語(yǔ)言開(kāi)發(fā)棧公眾號(hào)。
























