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

Go中廣泛使用了函數(shù)和方法來(lái)提供抽象,使我們的程序更易于閱讀和推理。從表面上來(lái)看,函數(shù)和方法看起來(lái)都相似的,但是存在一些重要的語(yǔ)義差異,這些差異可能會(huì)極大地影響代碼的可讀性。
通過(guò)指定參數(shù)的類型、返回值和函數(shù)主體來(lái)聲明函數(shù):
type Person struct {
Name string
Age int
}
// 這個(gè)函數(shù)返回一個(gè)新的對(duì)象`Person`
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}另一方面,通過(guò)額外指定“接收者”(在OOP術(shù)語(yǔ)中將是該方法所屬的“類 class”)來(lái)聲明方法:
// `Person`指針類型接收者的`isAdult方法
func (p *Person) isAdult() bool {
return p.Age > 18
}在上面的方法聲明中,我們?cè)?code>*Person類型上聲明了isAdult方法 。
函數(shù)調(diào)用使用獨(dú)立的參數(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是一個(gè)函數(shù),在該函數(shù)中,我們將`Person`作為參數(shù)而不是接收者進(jìn)行傳遞
func isAdult(p *Person) bool {
return p.Age > 18
}在這種情況下,執(zhí)行語(yǔ)法看起來(lái)有些奇怪:
factory := &PersonFactory{}
p := factory.NewPerson("John", 21)
fmt.Println(isAdult(p))
// true上面的代碼看起來(lái)比需要的要復(fù)雜得多。這向我們表明,方法和函數(shù)的差異主要是語(yǔ)法上的差異,應(yīng)該根據(jù)場(chǎng)景使用適當(dāng)?shù)某橄蟆?/p>
讓我們看一下Go應(yīng)用程序中遇到的一些常見(jiàn)用例,以及適用于每個(gè)應(yīng)用程序的適當(dāng)抽象(函數(shù)或方法):
方法的一個(gè)非常有用的特性是能夠?qū)⑺鼈冩溄釉谝黄穑瑫r(shí)仍保持代碼的清潔。讓我們以設(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ù)用于同一件事,那將看起來(lái)非常可怕:
p = withName(withAge(p, 18), "John")
在 可互換性 示例中,我們看到了使用PersonFactory對(duì)象來(lái)創(chuàng)建Person的新實(shí)例。事實(shí)證明,這是一種反模式,應(yīng)避免使用。
好使用NewPerson以前聲明的函數(shù)之類的函數(shù)進(jìn)行無(wú)狀態(tài)執(zhí)行。
這里的“無(wú)狀態(tài)”是指始終為同一輸入返回相同輸出的任何代碼
推論是,如果您發(fā)現(xiàn)函數(shù)讀取并修改了許多特定類型的值,則它可能應(yīng)該定義成該類型的方法。
語(yǔ)義是指代碼的閱讀方式。如果你用口語(yǔ)大聲朗讀代碼,那么哪個(gè)更有意義?
我們來(lái)看看isAdult 的函數(shù)和方法實(shí)現(xiàn)
customer := NewPerson("John", 21)
// Method
customer.isAdult()
// Function
isAdult(customer)在這里customer.isAdult() 對(duì)于詢問(wèn)「客戶是否是成年人?」的理解要比isAdult(customer) 好得多。此外,當(dāng)你問(wèn)「x 是成年人嗎?」時(shí),總是會(huì)在x 的上下文中被問(wèn)到。
以上是“Go中方法與函數(shù)的區(qū)別是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章題目:Go中方法與函數(shù)的區(qū)別是什么-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://chinadenli.net/article14/ccgcde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)、建站公司、品牌網(wǎng)站設(shè)計(jì)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容