golang中沒有類別。 golang不是純粹物件導向程式語言,它沒有class(類別)的概念,也就沒有繼承的說法,但Go也可以模擬物件導向的程式設計方式。在Go中,可以將struct比喻為其它語言中的class;透過struct定義結構體,表徵一類對象,例「type person struct {...}」。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
物件導向三大特徵:封裝,繼承,多型。
Go不是一門純粹物件導向程式語言,它沒有class(類別)的概念,也就沒有繼承的說法。但Go也可以模擬物件導向的程式設計方式,也就是可以將struct比喻為它語言中的class。
Go沒有class的概念,透過struct定義結構體,表徵一類物件。
type person struct { Age int Name string }
物件是狀態與行為的有機體。例如下面的java程式碼:
public class Person { int age; String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
不同於Java,Go的方法不需要跟類別的資料綁定在一個class的定義裡面,只需要定義在同一個套件內。這一點可能初學Go的同學,會覺得很奇怪。
type person struct { Age int Name string } func (p *person) GetAge() int { return p.Age } func (p *person) SetAge(age int) { p.Age = age } func (p *person) GetName() string { return p.Name } func (p *person) SetName(name string) { p.Name = name }
Go沒有建構函數,物件的資料載體就是一個struct。 Java支援建構函數,建構函數名字就跟類別名字一樣,多個建構子透過函數重載實現。
而Go建構函式則透過工廠函數進行模擬。實例如下:
type person struct { Age int Name string } /** 构造函数1--通过名字初始化 */ func newPersonByName(name string) *person { return &person{ Name: name, } } /** 构造函数2--通过年龄初始化 */ func newPersonByAge(age int) *person { return &person{ Age: age, } }
要注意的是,person結構體的名稱首字母要小寫,避免外部直接越過模擬的建構子
##public | #protected | friendly |
(default) #private |
##同一個類別 |
yes | yes | yes | 同一個套件 | |
yes | yes | no | #不同套件子類別 | |
yes | no | no | 不同套件非子類別 | |
no | no | no |
封裝
type person struct { Age int Name string } func NewPerson(age int, name string) *person{ return &person{age, name} } func (p *person) SetAge(age int) { p.Age = age } func (p *person) SetName(name string) { p.Name = name } func main() { p:= NewPerson(10, "Lily") p.SetName("Lucy") p.SetAge(18) }要注意的是,Go的方法是一種特殊的函數,只是編譯器的一種語法糖,編譯器瞧瞧幫我們把物件的引用當作函數的第一個參數。例如,下面的程式碼是等價的
func main() { p:= NewPerson(10, "Lily") p.SetName("Lily1") // 等价于下面的写法 // p是一个引用,函数引用 setNameFunc := (*person).SetName setNameFunc(p, "Lily2") fmt.Println(p.Name) }
繼承
type Animal struct { Name string } func (Animal) move() { fmt.Println("我会走") } func (Animal) shout() { fmt.Println("我会叫") } type Cat struct { Animal // 匿名聚合 } func main() { cat := &Cat{Animal{"猫"}} cat.move() cat.shout() }
多態
interface Animal { void move(); void shout(); } class Dog implements Animal { @Override public void move() { System.out.println("我会走"); } @Override public void shout() { System.out.println("我会叫"); } }而Go則是透過
鴨子類型
推斷,只要某個物件長得想鴨子,叫起來像鴨子,那麼它就是鴨子。也就是說,Go的介面是比較隱匿的,只要某個物件實作來介面申明的所有方法,那麼就認為它屬於該介面。type Animal interface { move() shout() } type Cat struct { Animal // 匿名聚合 } func (Cat)move() { fmt.Println("猫会走") } func (Cat)shout() { fmt.Println("猫会叫") } type Dog struct { Animal // 匿名聚合 } func (Dog)move() { fmt.Println("狗会走") } func (Dog)shout() { fmt.Println("狗会叫") } func main() { cat := Cat{} dog := Dog{} // 申明接口数组 animals := []Animal{cat, dog} for _,ele := range animals { // 统一访问 ele.move() ele.shout() } }【相關推薦:Go影片教學、
程式設計教學】
以上是golang中有沒有類的詳細內容。更多資訊請關注PHP中文網其他相關文章!