3 回答

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
假設(shè)T是struct,那么Go里面遵循下面幾個(gè)原則:
T的方法集僅擁有 T Receiver 方法。
*T 方法集則包含全部方法 (T + *T)。
所以你上面的例子dept1應(yīng)該是擁有方法:Name和SetName
而&dept1擁有方法:Name、SetName和Relocate
這個(gè)就是Go里面在設(shè)計(jì)方法的時(shí)候需要注意Receiver的類型

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
1、結(jié)構(gòu)Dept
的方法集中僅包含方法接收者為Dept的方法,即:Name()
和SetName()
)。所以,結(jié)構(gòu)Dept的實(shí)例僅為DeptModeA
的實(shí)現(xiàn)。
2、結(jié)構(gòu)的指針*Dept
的方法集包含了方法接受者為Dept
和*Dept
的方法,即:Name()
、SetName()
和Relocate()
。所以,接口Dept的實(shí)例的指針為全部三個(gè)接口——DeptModeFull
、DeptModeA
和DeptModeB
的實(shí)現(xiàn)。
但是我覺得上述設(shè)計(jì)和原則與方法調(diào)用的設(shè)計(jì)有些不一致,請(qǐng)看下面的代碼:
dept1.Relocate("Media", 12)fmt.Printf("Dept: %v\n", dept1)fmt.Printf("Dept name: %v\n", deptPtr1.Name())
打印的內(nèi)容:
Dept: {MySohu Media 12 }?Dept name: MySohu
這說明:結(jié)構(gòu)Dept
的實(shí)例可以調(diào)用其指針方法集中的方法。
我覺得設(shè)計(jì)不一致的地方是:既然結(jié)構(gòu)的訪法集不包含接收者為其指針的方法,那又為什么讓在結(jié)構(gòu)的實(shí)例上可以調(diào)用其指針訪法集中的方法呢?反過來看,既然結(jié)構(gòu)的實(shí)例可以調(diào)用其接口訪法集上的方法,那為什么不讓結(jié)構(gòu)的方法集直接包含這些方法呢?
不過,不管怎樣,這引出了第三條規(guī)則(官方規(guī)范的意譯):
3、如果結(jié)構(gòu)的實(shí)例x
是“可被尋址的”,且&x
的方法集中包含方法m
,則x.m()
為(&x).m()
的速記(快捷方式)。

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
所以其實(shí)
dept1.Relocate("Media", 12)
被自動(dòng)轉(zhuǎn)化成了?
(&dept1).Relocate("Media", 12)
學(xué)習(xí)了。
可尋址的意思大概就是已經(jīng)實(shí)例話了。如果你直接
var deptPtr2 *Dept deptPtr2.Relocate("Media", 12)
就不行。反之:
var deptPtr2 Dept deptPtr2.Relocate("Media", 12)
就可以。區(qū)別就在這里了。
- 3 回答
- 0 關(guān)注
- 186 瀏覽
添加回答
舉報(bào)