理解Go语言中的方法和接收者
0x01 前言
Go語(yǔ)言的語(yǔ)法實(shí)在有些不一樣,與其他面向?qū)ο笳Z(yǔ)言相比,Go的方法似乎有些晦澀。
0x02 方法的定義
在Go語(yǔ)言里,方法和函數(shù)只差了一個(gè),那就是方法在func和標(biāo)識(shí)符之間多了一個(gè)參數(shù)。
type user struct {name string,email string, }//這里是函數(shù)的定義 func notify(email string) {fmt.Println("Email is %s", email) }//這里是方法的定義 func (u user) notify(email string) {fmt.Println("Email is %d", email) }我們可以看到,方法是在func和notify之間多了一個(gè)user類(lèi)型的參數(shù)u,這個(gè)u就稱(chēng)作接收者。
0x03 接收者
接收者有兩種,一種是值接收者,一種是指針接收者。顧名思義,值接收者,是接收者的類(lèi)型是一個(gè)值,是一個(gè)副本,方法內(nèi)部無(wú)法對(duì)其真正的接收者做更改;指針接收者,接收者的類(lèi)型是一個(gè)指針,是接收者的引用,對(duì)這個(gè)引用的修改之間影響真正的接收者。像上面一樣定義方法,將user改成*user就是指針接收者。
接收者與對(duì)象
相信很多人看到這個(gè)接收者之后都很苦惱,到底這個(gè)接收者是什么,是干什么用的。我們?cè)趯W(xué)習(xí)一門(mén)新的語(yǔ)言的時(shí)候,都講究觸類(lèi)旁通,和我們已經(jīng)了解的語(yǔ)言作對(duì)比。那么我們就通過(guò)拿 Go 和其它帶有類(lèi)的面向?qū)ο蟮恼Z(yǔ)言做對(duì)比來(lái)搞清楚接收者是什么。這里我們用?php?來(lái)舉例子。
在php中,我們要定一個(gè)方法,首先是要定一個(gè)類(lèi)。
class User {protected $email;protected $name;public function __construct($name, $email){$this->email = $email;$this->name = $name;}public function notify(){echo "Email is {$email}.\n";}public function changeEmail($email) {$this->email = $email;} }然后再實(shí)例化一個(gè)對(duì)象,進(jìn)行操作,像這樣。
$user = new User('dary1', 'dary1@example'); $user->changeEmail('dary1@example.com'); $user->notify();接下來(lái),我們參照著來(lái)寫(xiě)一下Go的方法定義。
首先,我們是先要定義一個(gè)類(lèi)型,比如就是user好了,然后再定義方法。
type user struct {name stringemail string }func (u user) notify() {fmt.Println("Email is %d", u.email) }func (u *user) changeEmail(email string) {u.email = email }我們定義了兩個(gè)方法,一個(gè)是notify,它是值接收者方法;還有一個(gè)是changeEmail,它是指針接收者方法。可以看到,值接收者方法,接收者是一個(gè)副本,無(wú)法修改;指針接收者是引用,可以修改。
我們?cè)賮?lái)看一下調(diào)用:
dary1 := {"dary1", "dary1@oldexample.com"} dary1.changeEmail("dary1@example.com") dary1.notify()看看,是不是很熟悉!對(duì),就像我們剛剛寫(xiě)過(guò)的php代碼一樣,有沒(méi)有!dary1就是對(duì)象,name和email就是屬性,notify和changeEmail就是它的方法。只是,不同的是,我們沒(méi)有將它放到class中,而是用另外一種方式讓它們結(jié)合了,有了關(guān)系!
關(guān)于值接收者和指針接收者,其實(shí)Go在變異的時(shí)候有一個(gè)隱式轉(zhuǎn)換,將其轉(zhuǎn)換為正確的接收者類(lèi)型。就像下面這樣。
//daryl.changeEmail("daryl@example.com") (&daryl).changeEmail("daryl@example.com")wife := &daryl //wife.notify() (*wife).notify()?
總結(jié)
以上是生活随笔為你收集整理的理解Go语言中的方法和接收者的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 由浅入深剖析go channel
- 下一篇: 【k8s学习笔记】第二篇:在Ubuntu