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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將結(jié)構(gòu)指針分配給接口指針

將結(jié)構(gòu)指針分配給接口指針

Go
慕勒3428872 2022-09-19 17:35:01
我正在嘗試重構(gòu)一些gorang源代碼,我想使用接口,但我發(fā)現(xiàn)了巨大的困難(忍受我,我是一個硬核C / C++孤兒)我提取了一個小樣本,顯示了我得到的錯誤package mainimport "fmt"type LogProcessor interface {    Init() int}type MyProcessor struct {    a int}func (m MyProcessor) Init() int {    return m.a}func main() {    t := &(MyProcessor{2})    var p *LogProcessor = &(MyProcessor{4}) //!!!fails!!!    fmt.Println((*t).Init(), (*p).Init())}為什么第二次分配失?。刻砑有薷暮蟮拇a以演示我正在嘗試執(zhí)行的操作。我認(rèn)為接口更類似于C++類。我的錯。仍在學(xué)習(xí)package mainimport "fmt"type LogProcessor interface {    Init() int}type MyProcessor struct {    a int}func (m *MyProcessor) Init() int {    m.a++    return m.a}func main() {    t := &(MyProcessor{2})    m := MyProcessor{4}    var p LogProcessor = &m    fmt.Println(t.Init(), p.Init())    fmt.Println(t.a, m.a)}
查看完整描述

2 回答

?
楊__羊羊

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個贊

表達(dá)式是復(fù)合文本。采用復(fù)合文本的地址是有效的,它將是類型 。MyProcessor{2}*MyProcessor

所以在這里:

t := &(MyProcessor{2})

的類型將是 。t*MyProcessor

您的故障線路:

var p *LogProcessor = &(MyProcessor{4}) //!!!fails!!!

右側(cè)表達(dá)式的類型再次為 。它是指向具體類型的指針。的類型為 ,它是指向另一種類型的指針。可賦值性規(guī)則在這里不適用,因此該值根本無法賦值給變量。*MyProcessorp*LogProcessorp

請注意,有一個可分配性規(guī)則:

如果滿足以下條件之一,則值可賦給類型為 (“ 可賦值為 ”) 的變量xTxT

在您的示例中,的類型不是接口類型,而是指向接口的指針。你很少(如果有的話)需要這個。p

相反,如果您使用“僅”接口類型:

var p LogProcessor = &(MyProcessor{4}) // This works!

這是可行的,因?yàn)榫唧w類型實(shí)現(xiàn)了接口類型 。您也不需要括號,只需使用 .*MyProcessorLogProcessor&MyProcessor{4}

然后,您當(dāng)然不能取消引用(因?yàn)樗皇侵羔槪?,因此您必須使?.pp.Init()


查看完整回答
反對 回復(fù) 2022-09-19
?
手掌心

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個贊

它失敗了,因?yàn)槟谑褂弥赶蚪涌诘闹羔?,如果您刪除指向var p的LogProcessor的指針,它可以正常工作


package main


import "fmt"


type LogProcessor interface {

    Init() int

}


type MyProcessor struct {

    a int

}


func (m MyProcessor) Init() int {

    return 2

}


func main() {

    t := &(MyProcessor{2})

    var p LogProcessor = MyProcessor{4} // works without a pointer to  the interface type

    fmt.Println((*t).Init(), (p).Init())

}


查看完整回答
反對 回復(fù) 2022-09-19
  • 2 回答
  • 0 關(guān)注
  • 69 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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