为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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 关注
  • 56 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信