登录
首页 >  Golang >  Go问答

如何实现接口,但发布新的API?

来源:stackoverflow

时间:2024-04-11 18:18:40 263浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《如何实现接口,但发布新的API?》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

如何实现一个接口但禁止用户调用实现该接口的函数?

例如,我们有一个实现某个接口 i 的模块,该模块具有实现 bar 所需的函数:

//mymodule.go
import (I)

type Foo struct {
}

func (f *Foo) Bar(
      ...
      // DONT want users calling this directly
      // I.Bar eventually calls this   
) // dictated by I

func (f *Foo) BarCallMe() {
    ...
    I.Bar(f)
}

F = Foo{}
F.Bar() // make this not possible, do not want!
F.BarCallMe() // $PROFIT

我们如何防止 mymodule 的用户像 f.bar() 一样直接使用 bar() ?意思是,如果我们希望该模块的用户仅调用 barcallme,我们如何隐藏 bar

更一般地说,如何实现一个接口但发布另一个接口?

具体例子:最近我实现了golang的堆接口,需要实现者实现pushpop。但是, heap.push 调用您的 push (https://golang.org/src/container/heap/heap.go?s=1949:1986#l42),因此,如果用户直接调用我的 push,则不会有预期的结果。所以这里的问题是如何发布一个用户调用的push,同时仍然提供一个满足接口要求的push


解决方案


很简单,你不能。如果您没有提供接口中的所有方法,那么您就不会实现该接口,并且如果该接口要求导出这些方法(必须这样做,因为您是从另一个包中使用它),那么这些方法必须是公开的。无论使用多少匿名嵌入或新类型名称都不会改变这样一个事实:如果您希望用户能够将某些内容传递给 heap.Pop,它必须有一个他们可以调用的 Pop() . 如果您创建的东西没有可调用的 Pop() ,那么它就不能与 heap 中的函数一起使用,除非您提供某种方法将其转换为 heap .Interface,此时用户将能够在其上调用 Pop()。这并不是您所独有的,而且它是 Go 设计者选择如何使界面正常工作的基础。您可以接受它(并相信您的用户不会故意破坏东西),或者您可以选择不使用标准库中的容器。

今天关于《如何实现接口,但发布新的API?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>