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

方法表達(dá)式

  • 我們也可以對(duì)方法表達(dá)式進(jìn)行賦值和傳遞
  • 方法表達(dá)式是一個(gè)必須將方法類(lèi)型作為第一個(gè)參數(shù)的函數(shù)
asStringV := Part.String         // 有效簽名:func(Part) string
sv := asStringV(part)
hasPrefix := Part.HasPrefix      // 有效簽名:func(Part, string) bool
asStringP := (*Part).String      // 有效簽名:func(*Part) string
sp := asStringP(&part)
lower := (*Part).LowerCase       //  有效簽名:func(*Part)
lower(&part)
fmt.Println(sv, sp, hasPrefix(part, "w"), part)
  • 方法表達(dá)式是一種高級(jí)特性,在關(guān)鍵時(shí)刻非常有用
  • 自定義類(lèi)型有一個(gè)潛在的致命錯(cuò)誤,沒(méi)有一個(gè)自定義類(lèi)型可以保證它們初始化的數(shù)據(jù)是有效的

驗(yàn)證類(lèi)型

  • 對(duì)于許多簡(jiǎn)單的自定義類(lèi)型來(lái)說(shuō),沒(méi)必要進(jìn)行驗(yàn)證
  • 由于 Go 語(yǔ)言保證初始化所有變量(包括結(jié)構(gòu)體的字段)為它們的零值,因此顯式的結(jié)構(gòu)函數(shù)就是多余的
  • Go 語(yǔ)言不支持構(gòu)造函數(shù),因此必須顯式地調(diào)用構(gòu)造函數(shù)
  • 例子:
type Place struct {
  latitude, longitude float64
  Name string
}
func New(latitude, longitude float64, name string) *Place {
  return &Place{ saneAngle(0, latitude), saneAngle(0, longitude), name }
}
func (place *Place) Latitude() float64 { return place.latitude }
func (place *Place) SetLatitude(latitude float64) {
  place.latitude = saneAngle(place.latitude, latitude)
}
func (place *Place) Longitude() float64 { return place.longitude }
func (place *Place) SetLongitude(longitude float64) {
  place.longitude = saneAngle(place.longitude, longitude)
}
func (place *Place) String() string {
  return fmt.Sprintf("(%.3f, %3f) %q", place.latitude, place.longitude, place.Name)
}
func (original *Place) Copy() *Place {
  return &Place{ original.latitude, original.longitude, original.Name }
}

接口(1)

  • 接口是一個(gè)自定義類(lèi)型,它聲明了一個(gè)或者多個(gè)方法的簽名
  • 接口是完全抽象的,因此不能將其實(shí)例化
  • 可以創(chuàng)建一個(gè)其類(lèi)型為接口的變量,它可以賦值為任何滿(mǎn)足該接口類(lèi)型的實(shí)際類(lèi)型的值
  • interface{} 類(lèi)型是聲明了空方法集的接口類(lèi)型
  • 無(wú)論包含不包含方法,任何一個(gè)值都滿(mǎn)足 interface{} 類(lèi)型
  • 如果一個(gè)值有方法,那么其值包含空的方法集以及它實(shí)際包括的方法,這就是 interface{} 類(lèi)型可以用于任意值的原因
  • 如果我們不為有方法的值使用接口類(lèi)型,我們可以使用類(lèi)型斷言、類(lèi)型開(kāi)關(guān)或者甚至是反射等方式來(lái)訪問(wèn)方法
  • 簡(jiǎn)單的接口例子:
type Exchanger interface {
  Exchange()
}
  • Go 語(yǔ)言的慣例,定義接口名字需以 er 結(jié)尾
  • 定義一個(gè)方法的接口是非常普遍的
  • 接口實(shí)際上聲明的是一個(gè) API(Application Programming Interface,程序編程接口),即 0 個(gè)或者多個(gè)方法,雖然并不明確規(guī)定這些方法所需的功能
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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