将结构指针分配给接口指针

我正在尝试重构一些gorang源代码,我想使用接口,但我发现了巨大的困难(忍受我,我是一个硬核C / C++孤儿)


我提取了一个小样本,显示了我得到的错误


package main


import "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 main


import "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)

}


慕勒3428872
浏览 57回答 2
2回答

杨__羊羊

表达式是复合文本。采用复合文本的地址是有效的,它将是类型 。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()

手掌心

它失败了,因为您正在使用指向接口的指针,如果您删除指向var p的LogProcessor的指针,它可以正常工作package mainimport "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())}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go