上篇: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 很高
}