添加方法
- 方法是作用在自定義類型的值上的一類特殊函數(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
}