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

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

接口不能調(diào)用self方法

接口不能調(diào)用self方法

Go
Smart貓小萌 2023-04-24 15:37:37
我定義了兩個(gè)函數(shù)。當(dāng)我向它傳遞一個(gè)指針時(shí),我無法獲得定義的方法。為什么是這樣?type Visitor interface {    work()}func test(v *Visitor)  {    v.work() // error}func test1(v Visitor)  {    v.work() // ok}錯(cuò)誤:v.work 未定義(類型 *Visitor 是指向接口的指針,而不是接口)誰知道為什么
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊

func?test(v?*Visitor)??{
????v.work()?//?error
????}

v.work()應(yīng)該是一個(gè)方法調(diào)用。但是v是 type?*Visitor,一個(gè)指向接口的指針。指向接口的指針有 0 個(gè)方法,它不實(shí)現(xiàn)任何東西(空接口除外interface{})。

使用非指針時(shí),值v(或更確切地說它的類型)有一個(gè) method?work(),因此您可以調(diào)用它:

func?test(v?Visitor)??{
????v.work()?//?ok
????}

這里v.work()有效,因?yàn)?code>vis 是一個(gè)接口類型Visitor,它包含方法work()

可能令人困惑的是,如果您將方法添加到(非指針,非接口)具體類型,則相應(yīng)的指針類型也將具有該方法,您可以調(diào)用它。這是在規(guī)范中:方法集:

一個(gè)類型可能有一個(gè)與之關(guān)聯(lián)的方法集。接口類型的方法集就是它的接口。任何其他類型的方法集T由所有用接收者類型聲明的方法T組成。對(duì)應(yīng)指針類型的方法集是所有用receiver?or聲明的方法的集合(即也包含了 的方法集)。?*T*TTT進(jìn)一步的規(guī)則適用于包含嵌入式字段的結(jié)構(gòu),如結(jié)構(gòu)類型部分所述。任何其他類型都有一個(gè)空方法集。在一個(gè)方法集中,每個(gè)方法必須有一個(gè)唯一的非空白?方法名稱。

不同之處在于您對(duì)接口類型進(jìn)行了相同的嘗試,但這是行不通的。它適用于具體(非接口)類型。教訓(xùn)是永遠(yuǎn)不要使用指向接口的指針,除非你能解釋為什么需要它(很少需要)。


查看完整回答
反對(duì) 回復(fù) 2023-04-24
?
慕工程0101907

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊

正如錯(cuò)誤明確指出的那樣:

v.work 未定義(類型 *Visitor 是指向接口的指針,而不是接口)

這是因?yàn)?work() 函數(shù)是在指向接收器的指針上調(diào)用但在值上定義的。

type?Visitor?interface?{
????work()
}

但是在第二種情況下你正在傳遞指針類型的接收器,你會(huì)得到一個(gè)錯(cuò)誤。

在 Golang 規(guī)范中,方法集定義為:

一個(gè)類型可能有一個(gè)與之關(guān)聯(lián)的方法集。接口類型的方法集就是它的接口。任何其他類型T的方法集由所有聲明為接收者類型T的方法組成。對(duì)應(yīng)指針類型*T的方法集是所有聲明為接收者*T或T的方法的集合(即還包含方法T 組)。進(jìn)一步的規(guī)則適用于包含嵌入字段的結(jié)構(gòu),如結(jié)構(gòu)類型部分所述。任何其他類型都有一個(gè)空方法集。在一個(gè)方法集中,每個(gè)方法必須有一個(gè)唯一的非空方法名。

您可以采用的一種方法是使用可以在其上調(diào)用方法 work() 的結(jié)構(gòu)來實(shí)現(xiàn)接口。

package main


import "fmt"


type Visitor struct{}


type Visit interface {

? ? work()

}


func test(v Visit)? {

? ? v.work() // error

? ? fmt.Printf("%+v", v)

}


func (v *Visitor) work(){}



func main(){

? ? ? ?v := Visitor{}

? ? ? ?test(&v)

}


查看完整回答
反對(duì) 回復(fù) 2023-04-24
  • 2 回答
  • 0 關(guān)注
  • 156 瀏覽

添加回答

舉報(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)