日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

理解Go语言中的方法和接收者

發(fā)布時(shí)間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解Go语言中的方法和接收者 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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類型的參數(shù)u,這個(gè)u就稱作接收者。

0x03 接收者

接收者有兩種,一種是值接收者,一種是指針接收者。顧名思義,值接收者,是接收者的類型是一個(gè)值,是一個(gè)副本,方法內(nèi)部無(wú)法對(duì)其真正的接收者做更改;指針接收者,接收者的類型是一個(gè)指針,是接收者的引用,對(duì)這個(gè)引用的修改之間影響真正的接收者。像上面一樣定義方法,將user改成*user就是指針接收者。

接收者與對(duì)象

相信很多人看到這個(gè)接收者之后都很苦惱,到底這個(gè)接收者是什么,是干什么用的。我們?cè)趯W(xué)習(xí)一門新的語(yǔ)言的時(shí)候,都講究觸類旁通,和我們已經(jīng)了解的語(yǔ)言作對(duì)比。那么我們就通過(guò)拿 Go 和其它帶有類的面向?qū)ο蟮恼Z(yǔ)言做對(duì)比來(lái)搞清楚接收者是什么。這里我們用?php?來(lái)舉例子。

在php中,我們要定一個(gè)方法,首先是要定一個(gè)類。

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)寫一下Go的方法定義。

首先,我們是先要定義一個(gè)類型,比如就是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ì),就像我們剛剛寫過(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)換為正確的接收者類型。就像下面這樣。

//daryl.changeEmail("daryl@example.com") (&daryl).changeEmail("daryl@example.com")wife := &daryl //wife.notify() (*wife).notify()

?

總結(jié)

以上是生活随笔為你收集整理的理解Go语言中的方法和接收者的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。