第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Dept的實(shí)例的指針被判定為全部三個(gè)接口的實(shí)現(xiàn),而Dept的實(shí)例只是DeptModeA接口的實(shí)現(xiàn)?

Dept的實(shí)例的指針被判定為全部三個(gè)接口的實(shí)現(xiàn),而Dept的實(shí)例只是DeptModeA接口的實(shí)現(xiàn)?

Go
千巷貓影 2023-05-02 11:11:55
直接上代碼:首先,我定了三個(gè)接口、一個(gè)結(jié)構(gòu)和三個(gè)方法:type DeptModeFull interface {    Name() string     SetName(name string)     Relocate(building string, floor uint8)}type DeptModeA interface {    Name() string     SetName(name string)}type DeptModeB interface {    Relocate(building string, floor uint8)}type Dept struct {     name     string     building string     floor    uint8     Key      string} func (self Dept) Name() string {     return self.name } func (self Dept) SetName(name string) {     self.name = name } func (self *Dept) Relocate(building string, floor uint8) {     self.building = building     self.floor = floor }而后我寫了一些測(cè)試代碼:dept1 :=     Dept{         name:     "MySohu",         building: "Internet",         floor:    7}switch v := interface{}(dept1).(type) {case DeptModeFull:     fmt.Printf("The dept1 is a DeptModeFull.\n")case DeptModeB:     fmt.Printf("The dept1 is a DeptModeB.\n")case DeptModeA:     fmt.Printf("The dept1 is a DeptModeA.\n")default:     fmt.Printf("The type of dept1 is %v\n", v) } deptPtr1 := &dept1if _, ok := interface{}(deptPtr1).(DeptModeFull); ok {     fmt.Printf("The deptPtr1 is a DeptModeFull.\n") }if _, ok := interface{}(deptPtr1).(DeptModeA); ok {     fmt.Printf("The deptPtr1 is a DeptModeA.\n") }if _, ok := interface{}(deptPtr1).(DeptModeB); ok {     fmt.Printf("The deptPtr1 is a DeptModeB.\n") }打印出的內(nèi)容:The dept1 is a DeptModeA.? The deptPtr1 is a DeptModeFull. ?The deptPtr1 is a DeptModeA. ?The deptPtr1 is a DeptModeB.哪位大佬給講一下?
查看完整描述

3 回答

?
藍(lán)山帝景

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的類型

查看完整回答
反對(duì) 回復(fù) 2023-05-05
?
RISEBY

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è)接口——DeptModeFullDeptModeADeptModeB的實(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()的速記(快捷方式)。

查看完整回答
反對(duì) 回復(fù) 2023-05-05
?
偶然的你

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ū)別就在這里了。

查看完整回答
反對(duì) 回復(fù) 2023-05-05
  • 3 回答
  • 0 關(guān)注
  • 186 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)