首页 > 后端开发 > Golang > 为什么 Go 函数返回实现接口的结构体不满足接口返回函数字段?

为什么 Go 函数返回实现接口的结构体不满足接口返回函数字段?

DDD
发布: 2024-12-05 12:53:16
原创
543 人浏览过

Why Doesn't a Go Function Returning a Struct Implementing an Interface Satisfy an Interface-Returning Function Field?

Go 函数类型返回的结构体与接口不兼容

问题:

在 Go 中,为什么返回实现接口的结构的函数是否不满足期望字段的类型要求返回该接口的函数?

答案:

问题在于返回结构体的 Go 函数类型与返回结构体的函数类型不能互换接口,即使该结构实现了该接口。在为结构体中的函数声明类型签名时,特定的返回类型必须与声明的类型匹配。修改工厂函数直接返回接口类型即可解决问题。

示例:

package main

import "fmt"

func main() {
    thing := structToConstruct{getInstance}
    thing.performAction()
}

type myInterface interface {
    doSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}

func (s *structToConstruct) performAction() {
    instance := s.factoryFunction()
    instance.doSomething()
}

func getInstance() myInterface {
    return &myStruct{}
}

type myStruct struct{}

func (m *myStruct) doSomething() {
    fmt.Println("doing something")
}
登录后复制

本例中修改工厂函数返回实例myInterface 的,满足以下类型要求structToConstruct.

说明:

声明structToConstruct 类型时,我们指定factoryFunction 应该是一个返回myInterface 的函数。但是,expense.CreateInstance 函数返回*myStruct 值,该值不能直接分配给myInterface。这是因为 Go 接口提供类型安全性,返回特定结构类型(例如 *myStruct)的函数无法自动转换为返回其实现的接口类型的函数。

要使用 *myStruct value 与 myInterface,我们必须使用类型断言或通过创建包装转换的适配器函数来显式转换它:

func wrapper() myInterface {
    return expensive.CreateInstance()
}

thing := structToConstruct{wrapper}
登录后复制

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

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