# 首先雕欺,通過下面的例子對比JAVA的面向?qū)ο蠛虶O的面向?qū)ο?/p>
# 例子分別用JAVA和GO分別實現(xiàn)類型薄腻、接口收捣、方法 進(jìn)行對比
## Java中類型 接口 方法的定義?
```?
### Java接口
interface Person {
void sayHi();
}
### Java類
class Assian implement Person{?
String name;?
public Assian (String name) {?
this.name = name;?
}?
public void sayHi() {?
System.out.println(this.name + "Hello World.");?
}?
}?
### Java子類
class China extends Assian {
}
```?
### Java實例化對象?
```?
China china= new China ("liyang");?
china.sayHi();?
```?
## Go中類的定義?
```?
### Go接口
type Person interface {
sayHi()
}
### Go內(nèi)嵌類型
type Assian struct {?
name string?
}?
func (assian *Assian) sayHi() {?
fmt.Println(assian.name + " Hello World.")?
}?
### Go外部類型
type China struct {
Assian
}
```?
### Go實例化對象?
```?
var china1= China{name: "liyang"}?
china1.sayHi()?
```
#通過上面的例子,加深對Go語言面向?qū)ο蟮睦斫?/p>
# Go的類型系統(tǒng)總結(jié)
- Go的結(jié)構(gòu)體類型庵楷,類似于java的class罢艾,但Go中的結(jié)構(gòu)體是不能定義方法的,只能是變量尽纽,這點和Java不一樣的咐蚯,如果要訪問結(jié)構(gòu)體內(nèi)的成員變量,通過.操作符即可弄贿;
- Go的方法func是給struct添加的新行為仓蛆,定義方式是在func和方法名之間增加一個參數(shù);而Java的方法定義在class內(nèi)部挎春;
- Go可以對包中的 任意 類型定義任意方法,而不僅僅是針對結(jié)構(gòu)體豆拨,但不能對來自其他包的類型或基礎(chǔ)類型定義方法直奋;
- Go中,函數(shù)和方法是不一樣的施禾,我們一般稱包級別的(直接可以通過包調(diào)用的)稱之為函數(shù)脚线,比如fmt.Println();把和一個類型關(guān)聯(lián)起來的函數(shù)稱之為方法弥搞,關(guān)聯(lián)類型的函數(shù)邮绿,只能聲明了類型的實例后才可以調(diào)用,稱之為方法攀例。
- 在func關(guān)鍵字后要執(zhí)行該方法的接收者船逮,這個方法就是屬于這個接收者,接收者分為值接收者和指針接收者粤铭,需要使用指針接收者的有兩個場景挖胃,首先避免在每個方法調(diào)用中拷貝值(如果值類型是大的結(jié)構(gòu)體的話會更有效率);其次,方法可以修改接收者指向的值酱鸭。
- Go的func支持多值返回吗垮。如果有個返回值,我們用不到凹髓,不想浪費一個變量接收怎么辦烁登?這時候可以使用空標(biāo)志符_,這是JAVA不支持的。
- Go的指針和C中的聲明定義是一樣的,此處不贅述塘装,其作用類似于Java引用變量效果匾委。
- Go使用嵌入結(jié)構(gòu)體實現(xiàn)類似于Java的繼承功能,但這屬于一種組合的方式秉氧,我們可以把簡單的對象組合成復(fù)雜的對象,并且他們之間沒有強約束關(guān)系,Go倡導(dǎo)的是組合锁右,而不是繼承、多態(tài)讶泰。
- Go的接口和Java類似咏瑟,不過它不需要強制實現(xiàn),在Go中痪署,如果你這個類型(基本類型码泞,結(jié)構(gòu)體等都可以)擁有了接口的所有方法,那么就默認(rèn)為這個類型實現(xiàn)了這個接口狼犯,是隱式的余寥,不需要和java一樣,強制使用implement強制實現(xiàn)悯森。這種隱式接口方式宋舷,解藕了實現(xiàn)接口的包和定義接口的包:互不依賴。
- Go常用內(nèi)建接口有:error瓢姻、stringer祝蝠、reader、writer等等幻碱。我將在單獨的文章中總結(jié)绎狭。