其實GO並不是一個純物件導向程式語言。它沒有提供類(class)這個關鍵字,只提供了結構體(struct)型別。
java或者C# 裡面,結構體(struct)是不能有成員函式的。然而,Go語言中的結構體(struct)可以有”成員函式”。方法可以被新增到結構體中,類似於一個類的實現。
我個人覺得Go 語言在的物件導向,其實更簡單,也更容易理解。
學過java或C# 的人應該都知道,物件導向的三個基本特徵:封裝、繼承和多型。他們的定義我這裡就不細說了。下面,就直接看看 go 語言下的物件導向是怎樣實現的吧。
1. 封裝特性
Golang區分公有屬性和私有屬性的機制就是方法或屬性是否首字母大寫,如果首字母大寫的方法就是公有的,如果首字母小寫的話就是私有的。
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()
}
2. 繼承特性
GO語言的繼承方式採用的是匿名組合的方式:Woman 結構體中包含匿名欄位Person,那麼Person中的屬性也就屬於Woman物件。
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)
}
3. 多型特性
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()
}
最後
以上,就把Go語言如何實現物件導向的簡單介紹了一下,其實跟java和C# 等也都差不多,大家可以比較著來看。總結的來說就是:Go沒有類,而是鬆耦合的型別、方法對介面的實現。
本作品採用《CC 協議》,轉載必須註明作者和本文連結