首页 >后端开发 >Golang >如何在Go中正确实现隐藏接口方法?

如何在Go中正确实现隐藏接口方法?

Barbara Streisand
Barbara Streisand原创
2024-11-30 02:21:09397浏览

How to Properly Implement Hidden Interface Methods in Go?

使用隐藏方法实现接口

开发会计系统时,可能需要在主程序中隐藏接口的特定实现确保只有一个会计系统处于活动状态。为了实现这一点,可以考虑将接口方法设为未导出,并创建从本地适配器调用函数的导出函数。

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()
}

但是,这种方法会遇到编译错误,因为编译器无法访问未导出的 getInvoice会计系统包中的方法。

cannot use adapter (type accountingsystem.Adapter) as type accounting.IAdapter in argument to accounting.SetAdapter:
accountingsystem.Adapter does not implement accounting.IAdapter (missing accounting.getInvoice method)
have accountingsystem.getInvoice() error
want accounting.getInvoice() error

匿名结构体字段方法

一种可能的解决方案是使用匿名结构体字段。虽然这允许accountingsystem.Adapter满足accounting.IAdapter接口,但它阻止用户提供自己的未导出方法的实现。

type Adapter struct {
    accounting.IAdapter
}

替代方法

更惯用的方法是创建一个未导出的适配器类型并提供一个向会计注册适配器的函数

package accounting

type IAdapter interface {
    GetInvoice() error
}


package accountingsystem

type adapter struct {}

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

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

通过这种方式,accountingsystem.adapter类型对主程序是隐藏的,并且可以通过调用SetupAdapter函数来初始化accounting系统。

以上是如何在Go中正确实现隐藏接口方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn