Go中方法與函數(shù)的區(qū)別是什么-創(chuàng)新互聯(lián)

小編給大家分享一下Go中方法與函數(shù)的區(qū)別是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供加格達奇企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、HTML5建站、小程序制作等業(yè)務(wù)。10年已為加格達奇眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

Go中廣泛使用了函數(shù)和方法來提供抽象,使我們的程序更易于閱讀和推理。從表面上來看,函數(shù)和方法看起來都相似的,但是存在一些重要的語義差異,這些差異可能會極大地影響代碼的可讀性。

語法

聲明語法

通過指定參數(shù)的類型、返回值和函數(shù)主體來聲明函數(shù):

type Person struct {
  Name string
  Age int
}

// 這個函數(shù)返回一個新的對象`Person`
func NewPerson(name string, age int) *Person {
  return &Person{
    Name: name,
    Age: age,
  }
}

另一方面,通過額外指定“接收者”(在OOP術(shù)語中將是該方法所屬的“類 class”)來聲明方法:

// `Person`指針類型接收者的`isAdult方法
func (p *Person) isAdult() bool {
  return p.Age > 18
}

在上面的方法聲明中,我們在*Person類型上聲明了isAdult方法 。

執(zhí)行語法

函數(shù)調(diào)用使用獨立的參數(shù),方法調(diào)用使用接收者類型。

p := NewPerson("John", 21)

fmt.Println(p.isAdult())
// true

互換性

函數(shù)和方法 理論上可以互換。例如,我們可以將isAdult方法轉(zhuǎn)換為函數(shù),并將NewPerson函數(shù)作為方法:

type PersonFactory struct {}

// NewPerson現(xiàn)在是PersonFactory結(jié)構(gòu)的方法
func (p *PersonFactory) NewPerson(name string, age int) *Person {
  return &Person{
    Name: name,
    Age: age,
  }
}

// 現(xiàn)在,isAdult是一個函數(shù),在該函數(shù)中,我們將`Person`作為參數(shù)而不是接收者進行傳遞
func isAdult(p *Person) bool {
  return p.Age > 18
}

在這種情況下,執(zhí)行語法看起來有些奇怪:

factory := &PersonFactory{}

p := factory.NewPerson("John", 21)

fmt.Println(isAdult(p))
// true

上面的代碼看起來比需要的要復(fù)雜得多。這向我們表明,方法和函數(shù)的差異主要是語法上的差異,應(yīng)該根據(jù)場景使用適當(dāng)?shù)某橄蟆?/p>

用例

讓我們看一下Go應(yīng)用程序中遇到的一些常見用例,以及適用于每個應(yīng)用程序的適當(dāng)抽象(函數(shù)或方法):

方法鏈

方法的一個非常有用的特性是能夠?qū)⑺鼈冩溄釉谝黄穑瑫r仍保持代碼的清潔。讓我們以設(shè)置Person使用鏈接的某些屬性為例 :

type Person struct {
    Name string
    Age  int
}

func (p *Person) withName(name string) *Person {
    p.Name = name
    return p
}

func (p *Person) withAge(age int) *Person {
    p.Age = age
    return p
}

func main() {
    p := &Person{}

    p = p.withName("John").withAge(21)

  fmt.Println(*p)
  // {John 21}
}

如果我們將函數(shù)用于同一件事,那將看起來非常可怕:

p = withName(withAge(p, 18), "John")

有狀態(tài)與無狀態(tài)執(zhí)行

在 可互換性 示例中,我們看到了使用PersonFactory對象來創(chuàng)建Person的新實例。事實證明,這是一種反模式,應(yīng)避免使用。

好使用NewPerson以前聲明的函數(shù)之類的函數(shù)進行無狀態(tài)執(zhí)行。

這里的“無狀態(tài)”是指始終為同一輸入返回相同輸出的任何代碼

推論是,如果您發(fā)現(xiàn)函數(shù)讀取并修改了許多特定類型的值,則它可能應(yīng)該定義成該類型的方法。

語義

語義是指代碼的閱讀方式。如果你用口語大聲朗讀代碼,那么哪個更有意義?

我們來看看isAdult 的函數(shù)和方法實現(xiàn)

customer := NewPerson("John", 21)

// Method
customer.isAdult()

// Function
isAdult(customer)

在這里customer.isAdult() 對于詢問「客戶是否是成年人?」的理解要比isAdult(customer) 好得多。此外,當(dāng)你問「x 是成年人嗎?」時,總是會在x 的上下文中被問到。

以上是“Go中方法與函數(shù)的區(qū)別是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章題目:Go中方法與函數(shù)的區(qū)別是什么-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://m.kartarina.com/article14/ccgcde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣網(wǎng)站內(nèi)鏈網(wǎng)站設(shè)計建站公司品牌網(wǎng)站設(shè)計外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
主站蜘蛛池模板: 日韩AV无码精品一二三区| 中文字幕无码视频手机免费看| 精品无码国产一区二区三区51安 | 50岁人妻丰满熟妇αv无码区| 人妻少妇看A偷人无码精品| 精选观看中文字幕高清无码| 精品久久久无码21p发布| 亚洲AV无码乱码在线观看性色扶| 日韩欧国产精品一区综合无码| 婷婷四虎东京热无码群交双飞视频| 国产精品国产免费无码专区不卡| 精品无码一区二区三区亚洲桃色 | 久99久无码精品视频免费播放| 精品人妻无码区在线视频| 中文字幕乱偷无码AV先锋| 无码精品A∨在线观看无广告| 亚洲av无码国产精品夜色午夜 | 国产精品无码一本二本三本色 | 无码国内精品久久人妻麻豆按摩 | 午夜无码人妻av大片色欲| 久久国产精品无码HDAV| 午夜无码一区二区三区在线观看| 精品多人p群无码| 亚洲av永久无码精品网站| 人妻无码精品久久亚瑟影视| 亚洲av永久中文无码精品综合| 精品久久久久久久无码| 无码精品人妻一区二区三区漫画| 精品人妻无码专区中文字幕| 免费无码午夜福利片 | 亚洲?V无码乱码国产精品| 西西人体444www大胆无码视频| 亚洲熟妇无码一区二区三区 | 亚洲av永久中文无码精品| 亚洲精品无码专区| 亚洲AV成人无码网天堂| 岛国av无码免费无禁网站| 国产成人亚洲精品无码AV大片| 亚洲AV无码乱码精品国产| av无码aV天天aV天天爽| 免费看成人AA片无码视频吃奶|