Home >Backend Development >Golang >How to Implement Interface Methods Returning Interfaces in Golang?

How to Implement Interface Methods Returning Interfaces in Golang?

Linda Hamilton
Linda HamiltonOriginal
2024-11-11 06:29:02378browse

How to Implement Interface Methods Returning Interfaces in Golang?

Implementing Interface Method Returning an Interface in Golang

When attempting to implement an interface that returns another interface, a common error arises when the return type of the method does not match the expected type defined in the interface. Consider the following code snippet:

type IA interface {
    FB() IB
}

type IB interface {
    Bar() string
}

type A struct {
    b *B
}

func (a *A) FB() *B {
    return a.b
}

type B struct{}

func (b *B) Bar() string {
    return "Bar!"
}

Running this code will result in the following error:

cannot use a (type *A) as type IA in function argument:
    *A does not implement IA (wrong type for FB method)
        have FB() *B
        want FB() IB

Solution:

The problem lies in the return type of the FB method in the A struct. The IA interface expects FB to return an IB, but in the implementation, it is returning a *B. To rectify this, modify the return type of FB to IB as follows:

func (a *A) FB() IB {
    return a.b
}

Sharing Interfaces Across Packages:

It is possible to define interfaces in different packages and share them. In such cases, when implementing the interface in a struct, the full package path must be used for the return type of the method. For instance, if IA and IB are defined in a package called foo, and the implementation is in a package called bar, the declaration would be:

type IA interface {
    FB() foo.IB
}

And the implementation would be:

func (a *A) FB() foo.IB {
    return a.b
}

The above is the detailed content of How to Implement Interface Methods Returning Interfaces in Golang?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn