GO——學(xué)習(xí)筆記(七)

上篇:GO——學(xué)習(xí)筆記(六)

下篇:GO——學(xué)習(xí)筆記(八)

參考:

https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.5.md

示例代碼——go_6

https://github.com/jiutianbian/golang-learning/blob/master/go_6/main.go

Golang中的面向?qū)ο?/h2>

面向?qū)ο蟮幕径x

前面介紹了函數(shù)和struct,下面是特殊的一個函數(shù):帶有接收者的函數(shù),我們稱為method

//用struct來定義一個實體car
type car struct {
    brand string
    price string
    speed string
}

//定義關(guān)聯(lián)car的函數(shù),這個函數(shù)為car這個實體的method,面向?qū)ο笏枰幕緦傩院头椒ǘx這樣就都有了
func (c car) show() {
    fmt.Println("我是:", c.brand, c.price, c.speed)
}

func main() {
    var baoma car
    baoma.brand = "寶馬"
    baoma.price = "40萬"
    baoma.speed = "120km/h"

    baoma.show()    
}

指針作為接收者

除了變量作為接受者,還可以用指針作為接受者,可以用來保證設(shè)置屬性的操作等,真正作用與對象,而不是對象的copy

//用struct來定義一個實體car
type car struct {
    brand string
    price string
    speed string
}

//定義關(guān)聯(lián)car的函數(shù),這個函數(shù)為car這個實體的method,面向?qū)ο笏枰幕緦傩院头椒ǘx這樣就都有了
func (c car) show() {
    fmt.Println("我是:", c.brand, c.price, c.speed)
}

//指針作為接受者,用來保證設(shè)置屬性的操作等,真正作用與對象,而不是對象的copy
func (c *car) setBrand(brand string) {
    c.brand = brand
}

func (c *car) setPrice(price string) {
    c.price = price
}

func (c car) setSpeed(speed string) {
    c.speed = speed
}

func main() {
    benchi := new(car)
    benchi.setBrand("奔馳")
    benchi.setPrice("60萬")
    benchi.setSpeed("140km/h")

    benchi.show()
    //輸出 “我是: 奔馳 60萬” 沒有輸出速度,因為setSpeed不是作用在car本生,而是作用在car的copy上
}

method繼承

前面說寫了struct的匿名繼承,能夠繼承屬性,其實method也是可以繼承的。如果匿名字段實現(xiàn)了一個method,那么包含這個匿名字段的struct也能調(diào)用該method

//用struct來定義一個實體car
type car struct {
    brand string
    price string
    speed string
}

type suvcar struct {
    car  // struct作為匿名字段
    size string
}

//定義關(guān)聯(lián)car的函數(shù),這個函數(shù)為car這個實體的method,面向?qū)ο笏枰幕緦傩院头椒ǘx這樣就都有了
func (c car) show() {
    fmt.Println("我是:", c.brand, c.price, c.speed)
}

//指針作為接受者,比起直接傳對象,可以用來保證設(shè)置屬性的操作等真正作用于對象本身,而不是對象的copy
func (c *car) setBrand(brand string) {
    c.brand = brand
}

func (c *car) setPrice(price string) {
    c.price = price
}

func (c car) setSpeed(speed string) {
    c.speed = speed
}

func main() {
    var suvbaoma suvcar
    suvbaoma = suvcar{car{"寶馬suv", "80萬", "160km/h"}, "很高"}

    // 實現(xiàn)了匿名繼承的struct,除了上篇能夠繼承屬性外,也能繼承他的method
    suvbaoma.show()
    //輸出  我是: 寶馬suv 80萬 160km/h
}

method重寫

匿名繼承的method,可以通過定義自己同名的method來重寫method

//用struct來定義一個實體car
type car struct {
    brand string
    price string
    speed string
}

type suvcar struct {
    car  // struct作為匿名字段
    size string
}

//定義關(guān)聯(lián)car的函數(shù),這個函數(shù)為car這個實體的method,面向?qū)ο笏枰幕緦傩院头椒ǘx這樣就都有了
func (c car) show() {
    fmt.Println("我是:", c.brand, c.price, c.speed)
}

//重寫 suvcar 自己的show方法
func (c suvcar) show() {
    fmt.Println("我是:", c.brand, c.price, c.speed, c.size)
}

//指針作為接受者,比起直接傳對象,可以用來保證設(shè)置屬性的操作等真正作用于對象本身,而不是對象的copy
func (c *car) setBrand(brand string) {
    c.brand = brand
}

func (c *car) setPrice(price string) {
    c.price = price
}

func (c car) setSpeed(speed string) {
    c.speed = speed
}

func main() {
    var suvbaoma suvcar
    suvbaoma = suvcar{car{"寶馬suv", "80萬", "160km/h"}, "很高"}

    // 實現(xiàn)了匿名繼承的struct,也能繼承他的method
    suvbaoma.show()
    // 如果沒有重寫show方法,輸出  我是: 寶馬suv 80萬 160km/h
    // 如果重寫了show方法,輸出  我是: 寶馬suv 80萬 160km/h 很高
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容