Golang | 方法集的那些事

類型的值也可以調(diào)用指針接收者的方法!

image-20210626091914165

學(xué)習(xí)golang中關(guān)于方法部分知識的人一定了解過方法集(Method Set)的概念圈澈,也一定對上面這張圖不陌生,方法集定義如下規(guī)則:

規(guī)則:

  1. 類型的值的方法集只包含值接收者聲明的方法

  2. 指向 T 類型的指針的方法集既包含值接收者聲明的方法尘惧,也包含指針接收者聲明的方法

實際使用過程中會發(fā)現(xiàn)康栈,在T的值可尋址的情況下,類型的值也可以調(diào)用指針接收者的方法

package main

import "fmt"

type baseImpl string

const (
    BI = baseImpl("1234")
)

type base interface {
    func1 ()
}

func (b *baseImpl) func1() {
    fmt.Println("invoke base impl func1")
}

func main() {
    bi := baseImpl("1234")
    bi.func1() // 正常執(zhí)行褥伴,輸出 "invoke base impl func1"
    BI.func1() // 編譯器報錯谅将,Cannot call a pointer method on 'BI'
}

上述代碼中,定義了一個接口 base 以及其實現(xiàn)類 baseImpl重慢,并且baseImpl 是通過指針接收者的形式來實現(xiàn)接口定義的方法

在實際使用過程中可以看到饥臂,定義baseImpl的值bi是可以調(diào)用func1方法的,因為bi是可以尋址的

但是似踱,由于常量BI是不可尋址的隅熙,所以它遵循規(guī)則稽煤,無法調(diào)用func1方法

由此可見,對于可尋址的值而言囚戚,其方法集的范圍包含了接收者類型為值類型和指針類型酵熙;對于不可尋址的值而言,其方法集的范圍僅包含值類型接收者

什么值是不可尋址的驰坊?

常見不可尋址的值的類型有:

  • 常量
  • 基本類型值
  • 運算結(jié)果值
  • 字符串索引表達(dá)式和切片表達(dá)式的結(jié)果值
  • 字典的索引表達(dá)式結(jié)果值
  • 函數(shù)匾二、方法,及其調(diào)用表達(dá)式
  • 類型轉(zhuǎn)換
  • 斷言
package main

const (
    I = 1
)

func main() {
    i := &I           // 常量不可尋址
    str := &"1234"    // 基本類型拳芙,不可尋址
    u := &str[0]      // 字符串索引表達(dá)式察藐,不可尋址
    s := &str[1:2]    // 字符串切片表達(dá)式,不可尋址
    i2 := &int64(123) // 類型強(qiáng)轉(zhuǎn)舟扎,不可尋址

    strArr := []string{""}
    sa := &strArr[0] // 切片的索引表達(dá)式是可尋址的
}

總的來看分飞,不可變的、臨時結(jié)果睹限、以及不安全的譬猫,都不可尋址

  • 不可變的:如常量
  • 臨時結(jié)果:如運算結(jié)果值,索引表達(dá)式羡疗,切片表達(dá)式(切片的索引表達(dá)式除外)等
  • 不安全的:如字典索引表達(dá)式染服,函數(shù),方法等

方法接收者應(yīng)該選擇值類型還是指針類型顺囊?

應(yīng)該選擇指針類型接收者肌索,原因:

  1. 使用指針接收者意味著支持修改接收者指向的值
  2. 避免方法調(diào)用時,由值復(fù)制帶來的內(nèi)存&性能問題
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末特碳,一起剝皮案震驚了整個濱河市诚亚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌午乓,老刑警劉巖站宗,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異益愈,居然都是意外死亡梢灭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蒸其,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敏释,“玉大人,你說我怎么就攤上這事摸袁≡客纾” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵靠汁,是天一觀的道長蜂大。 經(jīng)常有香客問我闽铐,道長,這世上最難降的妖魔是什么奶浦? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任兄墅,我火速辦了婚禮,結(jié)果婚禮上澳叉,老公的妹妹穿的比我還像新娘隙咸。我一直安慰自己,他們只是感情好成洗,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布扎瓶。 她就那樣靜靜地躺著,像睡著了一般泌枪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秕岛,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天碌燕,我揣著相機(jī)與錄音,去河邊找鬼继薛。 笑死修壕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遏考。 我是一名探鬼主播慈鸠,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灌具!你這毒婦竟也來了青团?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤咖楣,失蹤者是張志新(化名)和其女友劉穎督笆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诱贿,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡娃肿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了珠十。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片料扰。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖焙蹭,靈堂內(nèi)的尸體忽然破棺而出晒杈,到底是詐尸還是另有隱情,我是刑警寧澤壳嚎,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布桐智,位于F島的核電站末早,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏说庭。R本人自食惡果不足惜然磷,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刊驴。 院中可真熱鬧姿搜,春花似錦、人聲如沸捆憎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躲惰。三九已至致份,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間础拨,已是汗流浹背氮块。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留诡宗,地道東北人滔蝉。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像塔沃,于是被迫代替她去往敵國和親蝠引。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容