首页 > 后端开发 > Golang > 为什么我的 Go struct 没有实现接口?

为什么我的 Go struct 没有实现接口?

Mary-Kate Olsen
发布: 2024-12-06 22:39:12
原创
411 人浏览过

Why Doesn't My Go Struct Implement the Interface?

接口实现需要匹配方法签名

在 Go 中,接口规定了方法的结构,包括其名称、参数和返回值。当结构体实现接口时,它必须严格遵守接口指定的方法签名。

考虑这个示例,其中结构体 D 及其方法 Connect 由于以下原因无法实现接口 B返回值不匹配:

type A interface {
    Close()
}

type B interface {
    Connect() (A, error)
}

type C struct {
}

func (c *C) Close() {

}

type D struct {
}

func (d *D) Connect() (*C, error) { // Mismatched function signature compared to interface B's Connect method
    c := new(C)
    return c, nil
}
登录后复制

在这种情况下,D 中的 Connect 返回一个指向 C 的指针和一个错误,但接口 B 期望 Connect 返回 A 的实现,并且一个错误。因此,错误表明结构体 D 没有实现接口 B,突出了方法签名之间对齐的重要性。

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)
登录后复制

要解决此问题,请确保结构体实现中的方法签名匹配接口中的方法声明。在这种情况下,应该修改 D 中的 Connect 方法以符合 B 接口:

func (d *D) Connect() (A, error) {
    c := new(C)
    return c, nil
}
登录后复制

相反,如果结构体实现中的方法签名与接口不同,则该结构体将不会实现接口。

type Equaler interface {
    Equal(Equaler) bool
}

type T int
func (t T) Equal(u T) bool { // Argument type mismatch
    return t == u
} // does not satisfy Equaler
登录后复制

在此示例中,Equal 中的参数类型应与接口类型 Equaler 匹配,而不是不同的类型 T,以实现该接口正确。

以上是为什么我的 Go struct 没有实现接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板