首页 > 后端开发 > Golang > 为什么返回结构体指针的 Go 函数不自动实现接口?

为什么返回结构体指针的 Go 函数不自动实现接口?

Linda Hamilton
发布: 2024-12-20 13:13:13
原创
287 人浏览过

Why Doesn't a Go Function Returning a Struct Pointer Automatically Implement an Interface?

Go 中的接口实现:返回结构体的函数类型

在使用 Go 时,经常会遇到函数返回结构体的情况实现一个接口。但是,当尝试将函数分配给需要接口实例的字段时,您可能会遇到类似于“无法在字段值中使用 [函数] 作为类型 [接口]”的错误。

要理解这一点错误,澄清返回结构体指针 (struct) 的函数不会自动实现为该结构体定义的接口是至关重要的。换句话说,struct 和 struct 在 Go 中是不同的类型。

在给定的示例中,函数 getInstance 预计返回 myInterface,这是行为(接口)的描述而不是具体的实现(结构体)。然而,getInstance返回一个指向myStruct实现(*myStruct)的指针,它与myInterface类型不兼容。

要解决这个问题,你需要修改

getInstance 返回一个实例myStruct 结构体,如下面更正后的代码所示:

package main

import "fmt"

func main() {
    var function func() myInterface

    function = getInstance

    newSomething := function()

    newSomething.doSomething()
}

type myInterface interface {
    doSomething()
}

type myStruct struct{}

func (m *myStruct) doSomething() {
    fmt.Println("doing something")
}

func getInstance() myInterface {
    return &myStruct{}
}
登录后复制
此修改确保

myStruct 实现 myInterface 接口,并且getInstance 函数返回正确的type.

虽然上述方法有效,但 Go 提出了一项语言更改,如果具体类型实现了接口,则自动将返回具体类型的函数转换为返回接口的函数。然而,由于潜在的性能和安全问题,该提案被拒绝。

以上是为什么返回结构体指针的 Go 函数不自动实现接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

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