首页 > 后端开发 > Golang > Go接口可以跨包使用未导出的方法来实现吗?

Go接口可以跨包使用未导出的方法来实现吗?

DDD
发布: 2024-11-27 21:27:09
原创
693 人浏览过

Can Go Interfaces Be Implemented with Unexported Methods Across Packages?

跨包使用未导出方法实现接口

在 Go 中,实现接口通常需要定义与接口签名匹配的导出方法。然而,在某些情况下,维持实现的可访问性是不合需要的。本文探讨了在单独的包中使用未导出方法实现接口的可行性。

考虑以下代码片段,其中会计系统的实现 (accountingsystem) 隐藏在未导出类型中:

package accounting

import "errors"

type IAdapter interface {
    getInvoice() error
}

var adapter IAdapter

func SetAdapter(a IAdapter) {
    adapter = a
}

func GetInvoice() error {
    if (adapter == nil) {
        return errors.New("No adapter set!")
    }
    return adapter.getInvoice()
}


package accountingsystem

type Adapter struct {}

func (a Adapter) getInvoice() error {return nil}
登录后复制

不幸的是,这种方法会产生编译错误,因为会计系统包中未导出的 getInvoice() 方法对会计不可见package.

替代方法

匿名结构字段:

一种解决方案是使用匿名结构字段实现接口在接口的包内。这允许在不暴露实现的情况下满足接口:

package accounting

type IAdapter interface {
    GetInvoice() error
}

type Adapter struct {
    IAdapter
}

func (*Adapter) GetInvoice() error {
    // Custom implementation
}
登录后复制

设置函数:

或者,您可以通过注册创建一个单独的函数来设置适配器未导出的类型作为适配器:

package accounting

type IAdapter interface {
    GetInvoice() error
}

package accountingsystem

type adapter struct {}

func (a adapter) GetInvoice() error {return nil}

func SetupAdapter() {
    accounting.SetAdapter(adapter{})
}

package main

func main() {
    accountingsystem.SetupAdapter()
}
登录后复制

这种方法允许您将适配器的类型保持私有同时将注册过程委托给另一个函数。

以上是Go接口可以跨包使用未导出的方法来实现吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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