接口的方法接收者的類型選擇

定義一個接口 if

type?if?interface{? ??

????Method1() string

}

定義一個結(jié)構(gòu)體 st

type?st?struct{? ?

????msg string

}

定義一個測試方法test, 可以接收 實現(xiàn)了if接口的實例 做為形參

func test (i if){? ?

????i.Method1()

}


測試1:?結(jié)構(gòu)體通過 值接收者 實現(xiàn) Method1

func (s st) Method1() string{? ?

????return s.msg

}

func main(){? ?

????s1 := st{"test"}? ?

????s2 := &st{"test"}? ?

????test(s1)? ?

????test(s2)

}

測試可以通過,沒有異常

測試2: 結(jié)構(gòu)體通過 指針接收者 實現(xiàn) Method1:

func (s *st) Method1() string{????

????return s.msg

}

func main(){? ?

????s1 := st{"test"}? ?

????s2 := &st{"test"} ??

????test(s2) //正常執(zhí)行

? ? test(s1) ?//拋出錯誤?(st doesn't implement interface (Method1 has pointer receiver) ??

}

關(guān)于 編譯起拋出的錯誤"st doesn't implement interface (Method1 has pointer receiver)"

要了解用指針接收者來實現(xiàn)接口時為什么結(jié)構(gòu)體類型 的值無法實現(xiàn)該接口,需要先了解方法集,方法集定義了一組關(guān)聯(lián)到給定類型的值或者指針的方法.定義方法時使用的接收者類型決定了這個方法是關(guān)聯(lián)到還是關(guān)聯(lián)到指針,還可以是兩個都關(guān)聯(lián).

簡單的可以認為,go編譯器定義了一個規(guī)則,如果使用指針接收者來實現(xiàn)一個接口,那么只有指向那個類型的指針才能夠?qū)崿F(xiàn)對應(yīng)的接口。如果使用值接收者來實現(xiàn)一個接口,那么這個類型的值和指針都能夠?qū)崿F(xiàn)對應(yīng)的接口。

想一想也可以這么理解,方法實參都是值傳遞,使用指針接收者是為了修改原來結(jié)構(gòu)體的內(nèi)容,你傳給了方法一個值,方法執(zhí)行期間對你這個原始值做了一份值copy, 而你又是想要改變原始值的內(nèi)容,如何能定位到原來的值的地址呢?索性直接編譯報錯,防止這種行為的出現(xiàn)。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的?。?因為Scala是基于Java虛擬機,也就是...
    燈火gg閱讀 3,608評論 1 24
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,329評論 0 17
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,143評論 2 9
  • 不是老人學壞了,而是壞人變老了。 5月26日,微博中曝出發(fā)生在洛陽王城公園籃球場廣場舞大爺大媽和籃球青年爭場地的事...
    科技銀狐閱讀 1,112評論 1 8
  • 災(zāi)難是自己招來的,因為心里有吸引災(zāi)難的磁石。要除去災(zāi)難就是要除去這塊磁石,而不是對別人說抱怨的話。 新的一輪瘋狂學...
    素樸之行閱讀 176評論 0 0

友情鏈接更多精彩內(nèi)容