Go中的指針類型有一個約定:任一指針具有其地址指帶的實(shí)體(最常見的是結(jié)構(gòu)體,當(dāng)然也可以是字符串、數(shù)字或者其他指針等)的所有屬性、方法,這樣“智能”的設(shè)定下使得我們可以 *** f ***
使用類型B的實(shí)例b給接口類型A的變量a賦值時,根據(jù)B實(shí)現(xiàn)A中定義的方法的接收者類型的不同(指針還是值),b的類型(指針還是值)有一些約束:
1、接收者類型是指針:這種情況下方法可能存在副作用(可能導(dǎo)致對方法接收者的修改),而對于接口類型的變量,如果它的值的類型是“值”那么go無法從這個變量中獲取指針(原因比較深奧),這個值只是一個副本,那么上述的方法“副作用”是無法實(shí)現(xiàn)的,所以go認(rèn)為賦值給;
2、接收者類型是值:方法沒有副作用,方法內(nèi)的值是個實(shí)際值副本,所以b不論為指針還是實(shí)例,接收者方法都不會有副作用,這時go不會強(qiáng)行要求;
由于Go中沒有方法重載機(jī)制,所以以上同名方法只能存在一個。
另,要分清方法中的方法接收者和方法參數(shù),當(dāng)不討論接口類型的賦值時,定義方法時不論將接收聲明為指針還是實(shí)例,在調(diào)用方法時go都將自動將接收者轉(zhuǎn)換為合適的類型(是否有副作用得看方法內(nèi)部實(shí)現(xiàn));而方法參數(shù)的類型是嚴(yán)格規(guī)定好的,無法進(jìn)行轉(zhuǎn)換。