亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

將結構指針分配給接口指針

將結構指針分配給接口指針

Go
慕勒3428872 2022-09-19 17:35:01
我正在嘗試重構一些gorang源代碼,我想使用接口,但我發現了巨大的困難(忍受我,我是一個硬核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())}為什么第二次分配失???添加修改后的代碼以演示我正在嘗試執行的操作。我認為接口更類似于C++類。我的錯。仍在學習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貢獻1943條經驗 獲得超7個贊

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

所以在這里:

t := &(MyProcessor{2})

的類型將是 。t*MyProcessor

您的故障線路:

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

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

請注意,有一個可分配性規則:

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

  • ...

  • T是一種接口類型,實現 。xT

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

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

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

這是可行的,因為具體類型實現了接口類型 。您也不需要括號,只需使用 .*MyProcessorLogProcessor&MyProcessor{4}

然后,您當然不能取消引用(因為它不是指針),因此您必須使用 .pp.Init()


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

TA貢獻1942條經驗 獲得超3個贊

它失敗了,因為您正在使用指向接口的指針,如果您刪除指向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())

}


查看完整回答
反對 回復 2022-09-19
  • 2 回答
  • 0 關注
  • 75 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號