這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在Go裡面的結構體和方法是很有意思的內容。它即和OO有點像,但又不完全一樣。為什麼這麼說呢?當你把結構體映射為OO裡面的類的時候,你給結構體添加方法,你就會發現其實方法與結構體並沒有嚴格意義上的關係。在Go裡面,方法是綁定到接受者上的。什麼是接受者?一個對象,這個對象可以是任何類型,int,string, struct, interface ...。
func (t *Type) method_name(parameters) return type
但是同名的方法,在同一個類型上只能出現一次。而且該類型必須與方法在同一個包中。
另外一點是內嵌結構體的問題,方法是可以被繼承的。也就是說一個結構體被內嵌到另一個結構體中,那麼父結構體也就具有了內嵌結構體的方法
>>person.go-------------------------------------------package persontype Person struct { firstName string lastName string}type BlackMan struct { Person color string}func (p *Person) FirstName() string { return p.firstName}func (p *Person) SetFirstName(newName string) { p.firstName = newName}>>main.go--------------------------------------------------package mainimport ( "./person" "fmt")func main() { p := new(person.BlackMan) p.SetFirstName("Ace") fmt.Println(p.FirstName())}
一張圖說明OO裡面的繼承體系與Go裡面的繼承體系區別
發現一個奇怪的問題:使用相同的方法去分配記憶體,得出的結果卻截然不同
func main() { var n [1024 * 1024 * 1024]int n[0] = 1 m := new(runtime.MemStats) runtime.ReadMemStats(m) fmt.Printf("%d\n", m.Alloc/1024)}
這樣程式的輸出是佔用8G空間,如果是1024 * 1024,輸出則是 36K的空間佔用。為什嗎?
Go中介面的指標方法和值方法的區別:
Pointer methods can be called with pointers.
• Value methods can be called with values.
• Value-receiver methods can be called with pointer values because they can be dereferenced
first.
• Pointer-receiver methods cannot be called with values, however, because the value stored
inside an interface has no address.
Go的物件導向總結
在Go裡面是沒有類的概念的,類型和方法是松耦合的,通過介面讓他們連結在一起。
OO裡面三個重要的概念:封裝,繼承和多態,在Go裡面是這樣對應的
封裝(資料隱藏):其他的OO語言有4個存取層級,在Go裡面只有2種
1. 包級:對象在整個包的範圍內可見,以小寫字母開頭
2. 被匯出:對象在包外可見,以大寫字母開頭
一個類型可以只有方法定義在它的包裡。
繼承:通過內嵌的一個或多個類型來達到多繼承的目的
多態:介面,一個類型變數可以被分配給它的任意介面實現的執行個體。類型和介面是松耦合的, 多繼承可以通過實現多個介面來完成。Go的介面不是Java或C#介面的變體, 它們更加的獨立並且是大規模編程,魯棒性和演變設計的關鍵