添加方法
- 方法是作用在自定義類型的值上的一類特殊函數(shù),通常自定義類型的值會被傳遞給該函數(shù)
- 方法可以以指針或者值的形式傳遞,這取決于方法如何定義
- 定義方法的語法幾乎等同于定義函數(shù)
- 可以為任何自定義類型添加一個或者多個方法
- 一個方法的接收者總是一個該類型的值,或者只是該類型的指針
- 對于任何一個給定的類型,每個方法名必須唯一
- Go 語言推薦的方式是使用名字唯一的函數(shù)
- 例子:
type Count int
func (count *Count) Increment() { *count++ }
func (count *Count) Decrement() { *count-- }
func (count Count) IsZero() bool { return count == 0 }
var count Count
i := int(count)
count.Increment()
j := int(count)
count.Decrement()
k := int(count)
fmt.Println(count, i, j, k, count.IsZero())
- 類型的方法集是指可以被該類型的值調(diào)用的所有方法的集合
- 數(shù)據(jù)類型的值很大,或者需要修改該值,則需要讓方法接受一個指針類型的接收者
重寫方法
- 任何嵌入類型中的方法都可以當(dāng)做該自定義結(jié)構(gòu)體自身的方法被調(diào)用,并且可以將其內(nèi)置類型作為其接收者
- 例子:
type Item struct {
id string // 具名字段(聚合)
price float64 // 具名字段(聚合)
quantity int // 具名字段(聚合)
}
func (item *Item) Cost() float64 {
return item.price * float64(item.quantity)
}
type SpecialItem struct {
Item // 匿名字段(嵌入)
catalogId int // 具名字段(聚合)
}
// SpecialItem嵌入了一個Item類型。這意味著我們可以在一個SpecialItem上調(diào)用Item的Cost()方法
special := SpecialItem{Item{"Green", 3, 5}, 207}
fmt.Println(special.id, special.price, special.quantity, special.catalogId)
fmt.Println(special.Cost())
- 當(dāng)調(diào)用
special.Cost() 的時候,由于 SpecialItem 類型沒有它自身的 Cost() 方法, Go 語言會使用 Item.Cost() 方法
- 也可以在自定義的結(jié)構(gòu)體中創(chuàng)建與所嵌入的字段中的方法同名的方法,來覆蓋被嵌入字段中的方法:
type LuxuryItem struct {
Item // 匿名字段(嵌入)
markup float64 // 具名字段(聚合)
}
func (item *LuxuryItem) Cost() float64 { // 沒必要這么冗長
return item.Item.price * float64(item.Item.quantity) * item.markup
}
func (item * LuxuryItem) Cost() float64 { // 沒必要的重復(fù)!
return item.price * float64(item.quantity) * item.markup
}
func (item * LuxuryItem) Cost() float64 { // 完美
return item.Item.Cost() * item.markup
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。