登录
首页 >  Golang >  Go问答

接口方法的嵌套提升导致其隐藏

来源:stackoverflow

时间:2024-03-08 23:09:26 257浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《接口方法的嵌套提升导致其隐藏》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我正在开发一个支持不同功能的各种物理设备的应用程序(https://github.com/andig/evcc)。向应用程序公开的实际功能由配置定义。

当前代码使用接口来确定特定设备是否支持某种功能,例如

if d.(MeterEnergy) ... // can call the MeterEnergy() method

现在设备可以支持任意功能组合(能量、功率、电流、电压等),我正在尝试找到一种方法来初始化此类设备。

我尝试通过根据功能创建结构来实现此目的,其中每种类型的结构都实现特定的接口。 其他功能作为升级接口添加,如 https://play.golang.org/p/l9xp_h8iwjo 中所示。不幸的是,这失败了,因为仅公开了静态类型的方法和第一个提升的接口,但嵌套的提升的方法被丢弃。

这是 go 设计的吗?有优雅的解决方法吗?


解决方案


您尝试做的事情听起来像是尝试在运行时将接口组合成结构。这是行不通的。首先,让我们看看您拥有什么:

type fooer interface{ foo() }
type barer interface{ bar() }
type bazer interface{ baz() }

type fooer struct{}
func (i *fooer) foo() { println("foo") }

type barer struct{ fooer }
func (i *barer) bar() { println("bar") }

type bazer struct{ fooer }
func (i *bazer) baz() { println("baz") }

func newfooer(bar, baz bool) fooer {
    f := &fooer{}
    var foo fooer = f
    if bar {
       b := &barer{foo}
       foo = b
    }
    if baz {
       b := &bazer{foo}
       foo = b
    }
   return foo
}

函数返回的是 fooerbarerbazer 的实例。程序中没有同时实现 barerbazer 的类型,因此您尝试执行的操作不会发生。

即使使用 abazer 结构的部分,您仍然必须在结构中初始化 fooer 实现,因为这是 fooer 类型的成员字段,并且您必须将其设置为 fooer 的实现。

实现此目的的一种方法是使用胖接口:

type fat struct {
   foo fooer
   bar barer
   baz bazer
}

然后,如果 fat 结构体表示的设备支持这些接口,则将 foobarbaz 设置为非零值。然后您还可以检查:

func f(dev Fat) {
   if dev.Bar!=nil {
     // Device support Bar interface
   }
}

理论要掌握,实操不能落!以上关于《接口方法的嵌套提升导致其隐藏》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

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