duanpu2272 2009-11-30 04:12
浏览 39
已采纳

不能在字段值中将(* struct)用作(* interface)

I have the following code:

// eventloop.go
type Object interface {
    ActivateSlot(name string, parameters vector.Vector);
}



// main.go
import loop "./eventloop"

// ...

const slotname = "printer"

type printer struct {
    slot loop.Slot;
}

func (p *printer) Init() {
    p.slot = loop.Slot{slotname, p}; // offending line
}

func (p *printer) ActivateSlot(name string, parameters vector.Vector) {
    fmt.Println("Slot called: ", name); 
}

When I try to compile, I get the following error:

jurily@jurily ~/workspace/go $ ./build.sh
main.go:23: cannot use p (type *printer) as type *eventloop.Object in field value

If I comment the offending line out, it compiles and runs fine. What's happening here? What am I missing?

  • 写回答

1条回答 默认 最新

  • donglun7151 2009-11-30 04:38
    关注

    Update: This code compiles fine here (all in the same package):

    type Object interface {
        ActivateSlot(name string, parameters vector.Vector);
    }
    type Slot struct {
      name string;
      stuff Object;
    }
    
    const slotname = "printer"
    type printer struct {
        slot Slot;
    }
    func (p *printer) Init() {
        p.slot = Slot{slotname, p}; // offending line
    }
    func (p *printer) ActivateSlot(name string, parameters vector.Vector) {
        fmt.Println("Slot called: ", name);
    }
    

    It seems that what you are missing is that *printer is of type Object, and you are trying to assign it to a field of type *Object, which is a different type.

    In most cases you would write it like above - without pointers to interface types - but if you have to, you can make it compile like this:

    type Slot struct {
      name string;
      stuff *Object;
    }
    func (p *printer) Init() {
         var o Object = p;
        p.slot = Slot{slotname, &o}; // offending line
    }
    

    So p is an Object, you need to take the address of p to match the *Object specification.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能