天天看點

【GoLang】golang 面向對象程式設計 & 面向接口程式設計

【GoLang】golang 面向對象程式設計 & 面向接口程式設計

005.面向對象&接口程式設計

1 面向函數程式設計

1.1 将資料作為參數傳遞到函數入參

1.2 對象與函數是分離的

2 面向對象程式設計

2.1 使用者看起來函數作為對象的屬性而非參數

2.2 函數屬于對象

2.3 method是附屬在一個給定的類型上的,他的文法和函數的聲明文法幾乎一樣, 隻是在func後面增加了一個receiver(也就是method所依從的主體)

2.4 文法

2.4.1 func (r ReceiverType) funcName(parameters) (results)

2.4.2 雖然method的名字一模一樣,但是如果接收者不一樣,那麼method就不一樣

2.5 傳遞方式

2.5.1 值傳遞

2.5.1.1 普通類型作為Receiver僅僅是以副本作為操作對象,并不對原執行個體對象發生操作

2.5.2 引用傳遞

2.5.2.1 指針作為Receiver會對執行個體對象的内容發生操作

2.6 method繼承

2.6.1 通過匿名字段繼承 method

2.7 method重寫

2.7.1 派生struct可以通過重寫method覆寫

3 面向接口程式設計

3.1 概念

3.1.1 與Java概念一緻,定義一組方法的集合

3.1.2 interface可以被任意的對象實作

3.1.3 同理,一個對象可以實作任意多個interface

3.1.4 任意的類型都實作了空interface(我們這樣定義:interface{}),也就是包含0個method的interface

3.1.5 interface 變量可以接收 實作了該接口方法的任意對象

3.2 使用

3.2.1 type IntfTest interface定義接口

3.2.2 struct定義對象

3.2.3 使用method實作接口

3.2.4 使用struct繼承對象屬性,同時也繼承了method

3.2.5 可以繼續覆寫重寫繼承的預設method

3.2.6 使用interface變量可以通路任何實作了該接口的對象

3.3 空interface

3.3.1 不包含任何method,是以所有的類都實作了空interface

3.3.2 任何對象都可以指派給空interface,即可以存儲任意類型對象,類似于C語言的 C語言的void*

3.3.3 一個函數把interface{}作為參數,那麼他可以接受任意類型的值作為參數

3.3.4 一個函數傳回interface{},那麼也就可以傳回任意類型的值

3.4 interface作為參數

3.4.1 标準庫中,fmt.Println的入參就是 ...interface{}

3.4.1.1

3.4.2 該檔案中定義了 Stringer 接口,實作了該接口的對象就可以被 fmt.Println格式化輸出

3.4.2.1

3.4.3 如果未實作該接口,則按照預設的格式輸出,Go預設為所有對象都有該接口的實作,可以直接格式化輸出

3.4.4 注意

3.4.4.1 實作了error接口的對象(即實作了Error() string的對象),使用fmt輸出時,會調用Error()方法,是以不必再定義String()方法了

3.5 interface變量存儲類型判斷

3.5.1 使用 value, ok = element.(T) 判斷

3.5.2 switch測試

3.5.2.1 switch value := element.(type)

3.5.2.2 element.(type)文法不能在switch外的任何邏輯裡面使用, 如果你要在switch外面判斷一個類型就必須使用第一種方法

3.6 interface組合

3.6.1 如果一個interface1作為interface2的一個嵌入字段,那麼interface2隐式的包含了interface1裡面的method

3.6.2 golang源碼包示例

3.6.2.1

3.7 反射

3.7.1 golang的反射與Java相比功能弱很多

3.7.2 golang不支援解析string然後執行

3.7.3 golang的反射機制隻能存在于已經存在的對象上面

繼續閱讀