Go 語言程序設(shè)計——面向?qū)ο缶幊蹋?)

添加方法

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容