之前在開發中編得過就行,沒有好好地去思考一些細節問題,比如inte***ce到底有什麼用,現在好好總結下
1.方法
package main
import "fmt"
import "reflect"
type s struct
func (s s) set1(v int)
func (s *s) set2(v int)
func (s *s) get() int
func main()
func dumpmethodset(i inte***ce{})
}
注意,用receiver型別為t的例項去呼叫方法其實可以呼叫到所有t和*t的方法,不受方法集約束,編輯器會自動找到對應方法並轉換 receiver 實參
下面這個例子可以看出,t和*t作為receiver方法集的不同會導致什麼錯誤
package main
type i inte***ce
type s struct
func (s s) set1(v int)
func (s *s) set2(v int)
func main()
2.介面
package main
import "fmt"
type pcer inte***ce
//記憶體條
type memoryer inte***ce
//cpu
type cpuer inte***ce
type highendpc struct
type lowhendpc struct
func (self *highendpc) getbrand() string
func (self *highendpc) getmemory() int
func (self *highendpc) getcpu() int
func (self *highendpc) getgpu() int
func (self *highendpc) printinfo()
func (self *lowhendpc) getbrand() string
func (self *lowhendpc) getmemory() int
func (self *lowhendpc) getcpu() int
func (self *lowhendpc) printinfo()
func main()
homepc := highendpc
mypc := pcer 是companypc和homepc的抽象,只要實現了介面中的方法,就可以塞進去
for _, pc := range mypc
}
執行結果:
低端電腦 品牌:dell,記憶體大小8,處理器核心數2
高階電腦 品牌:diy,記憶體大小16,處理器核心數4,視訊記憶體大小11
這個例子展現了inte***ce的一些特性和應用場景,類似於c++的多型的思想,但是不需要顯式地去讓struct去「繼承」inte***ce的方法集,只要這個struct實現了inte***ce中所有方法,這個實現是指實現了相同名稱、引數列表 (不包括引數名) 以及返回值的方法。
Go學習筆記 結構體 方法 介面
go 語言中沒有 類 的概念,也不支援像繼承這種物件導向的概念。但是go 語言的結構體與 類 都是復合結構體,而且go 語言中結構體的組合方式比物件導向具有更高的擴充套件性和靈活性。7.1.1 結構體定義 結構體一般定義如下 type identifier struct 例如我們想宣告乙個學生的結構...
JAVASE抽象方法,介面
一抽象類 1抽象類的產生 當編寫乙個類時,我們往往會為該類定義一些方法,這些方法是用來描述該類的功能具體實現方式,那麼這些方法都有具體的方法體。但是有的時候,某個父類只是知道子類應該包含怎麼樣的方法,但是無法準確知道子類如何實現這些方法。比如乙個圖形類應該有乙個求周長的方法,但是不同的圖形求周長的演...
繼承 抽象方法 介面
一 好處 繼承的本質在於抽象。類是對物件的抽象,繼承是對某一批類的抽象。為了提高 的復用性,子類可以呼叫父類的方法和屬性。public class animal class bird extends animal二 乙個子類只能繼承乙個父類,但介面可以繼承多個父介面。三 super 是直接父類物件的...