duanrong6802 2016-05-29 07:55
浏览 70
已采纳

Golang:满足接口要求的类型别名结构

See code below:

I have an odd behavior that I can't understand in Golang. If I want to create a type alias of a structure and that structure meets the requirements of a interface type, then the type alias won't meet the requirements of that interface type. I have no idea why this is happening. Any thoughts?

package main

import (
    "fmt"
)

type MyInt struct {
    value int
}

func (m MyInt) DoubleIt() int {
    return m.value * 2
}

type MyInter interface {
    DoubleIt() int
}

type MyIntContainer struct {
    d MyInter
}

type MC MyIntContainer
type MI MyInt

func main() {
    e1 := MyIntContainer{MyInt{12}} //This is OK
    fmt.Printf("%d
", e1.d.DoubleIt())
    e2 := MC{MI{12}} //this fails with error - line 29
    fmt.Printf("%d
", e2.d.DoubleIt())
}

The error message: Line 29: cannot use MI literal (type MI) as type MyInter in field value: MI does not implement MyInter (missing DoubleIt method)

  • 写回答

1条回答 默认 最新

  • doujiu8479 2016-05-29 08:06
    关注

    In your code MI is a new type which doesn't carry over the methods from the original type. The DoubleIt method really isn't available:

    e2 := MI{12}
    fmt.Printf("%d
    ", e2.DoubleIt())
    
    e2.DoubleIt undefined (type MI has no field or method DoubleIt)
    

    An alternative if you want to carry over the methods would be to embed MyInt:

    type MI struct {
        MyInt
    }
    

    Then you can say:

    e2 := MI{MyInt{12}}
    fmt.Printf("%d
    ", e2.DoubleIt())
    

    From the spec:

    A type may have a method set associated with it. The method set of any other type T consists of all methods declared with receiver type T. Further rules apply to structs containing anonymous fields, as described in the section on struct types. Any other type has an empty method set.

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

报告相同问题?

悬赏问题

  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟