這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
type $name struct{ property01 int property02 int }
Golang裡面的方法和介面都是基於這裡type *** struct建立的類型,這裡其實可以理解為:
class $name { public int property01; public int property02; }
類型就是類。
所以我們說是類型的某個方法,類型實現了某個介面。
類型是屬性的集合,介面是方法的集合
函數的定義:func $funcName ( ) ( ){}
方法的定義:func ( ) $funcName ( ) ( ){}
Func (成員變數 類型) funname(局部變數 類型,局部變數 類型) (傳回值類型) {}
成員變數是通過type來定義的。
函數的參數列表是需要傳遞的局部變數。
golang的方法的類型簽名:1.指明要給哪個類型添加方法;2.指定調用此方法的變數的是實值型別還是指標類型,調用此方法的變數必須按照類型簽名這裡來決定是用實值型別還是指標類型,golang能自動轉換,但你必須確保這個變數能被正確轉換為相應的值或指標。例如,一個介面類型的變數就沒法被轉換為一個struct的指標。
繼承:
當一個類型B的某個欄位(匿名欄位)的類型是另一個類型 A的時候,那麼類型 A所擁有的全部欄位都被隱式地引入了當前定義的這個類型B。這樣就實現了繼承。B類型的變數就可以調用A的所有屬性和方法。也就是說A繼承了B。
定義繼承時,子類中一般都含有一個類型是父類的匿名欄位。匿名欄位就是用來實現繼承的。
package mainimport ("fmt")type Animal struct {Name stringAge int}func (ani *Animal) GetAge() int {return ani.Age}type Dog struct {Animal //Animal匿名欄位}func main() {dog := Dog{Animal{"dog", 10}}fmt.Println(dog.Age)fmt.Println(dog.GetAge())}
方法的重寫
如果一個類型B實現了作為其屬性的類型A中的方法。那麼這個類型B的值調用方法的時候調用的是自己類型B的方法,而不是屬性類型A的方法。
代碼如下:
package mainimport ("fmt")type Animal struct {Name stringAge int}func (ani *Animal) GetAge() int {return ani.Age}type Dog struct {Animal //Animal匿名欄位}func (ani Dog) GetAge() int {return ani.Age + 1}func main() {dog := Dog{Animal{"dog", 10}}fmt.Println(dog.Age)fmt.Println(dog.GetAge())}
介面
1 介面
1)定義介面類型
定義介面,介面中可以有未實現的方法。
type Animal interface {GetAge() int}
1)實現介面類型
如果某個類型實現了介面的所有方法。則這個類型實現了這個介面。
type Animal interface {GetAge() int}type Dog struct {Name stringAge int}
//實現GetAge()方法則實現了Animal介面
func (ani Dog) GetAge() int {return ani.Age}