dsgft1486 2018-08-21 08:52
浏览 12

如果结构具有参数实现接口的功能,则结构不实现接口

I have a package in which I have two interfaces

package main
type A interface {
    Close()
}
type B interface {
    Connect() (A, error)
}

I have also two structures which implements these interfaces

type C struct {
}

func (c *C) Close() {

}

type D struct {
}

func (d *D) Connect() (*C, error) {
    c := new(C)
    return c, nil
}

Next I have a function which as a parameter wants an object which implements interface B

func test(b B) {
}

Finally, at the main() function I create D structure object and want to call test() function

func main() {
    d := new(D)
    test(d)
}

If I try to build that package I have an error.

cannot use d (type *D) as type B in argument to test: *D does not implement B (wrong type for Connect method) have Connect() (*C, error) want Connect() (A, error)

It is simple example of my code where I use external package and want to mock structures for tests. Is it any solution to use interfaces instead of types?

  • 写回答

2条回答 默认 最新

  • dongming6201 2018-08-21 08:55
    关注

    The returned type for your Connect method should be A and not *C.

    The way you defined the Connect method is that it should return an interface, not a specific type. You will still be able to return *C as it implements the A interface.

    package main
    
    type A interface {
        Close()
    }
    
    type B interface {
        Connect() (A, error)
    }
    
    type C struct {
    }
    
    func (c *C) Close() {
    }
    
    type D struct {
    }
    
    func (d *D) Connect() (A, error) {
        c := new(C)
        println("successfully created new C:", c)
        return c, nil
    }
    
    func test(b B) {
        b.Connect()
    }
    
    func main() {
        d := new(D)
        test(d)
    }
    

    Outputs

    successfully created new C: 0xe28f0

    Try it out yourself here

    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题