为了账号安全,请及时绑定邮箱和手机立即绑定

覆盖 []interfaces{} 并获取每种类型的通道字段

覆盖 []interfaces{} 并获取每种类型的通道字段

Go
慕桂英3389331 2021-12-07 19:34:56
我会尽量把它说清楚,首先在我的脑海里。我有一个接口和几个通过声明方法继承它的类型。非常漂亮和聪明的继承方式。然后我有一个“超级” Type Thing,所有其他类型都嵌入了它。该Thing结构具有 Size int 和 Out chan 属性我想理解的是为什么我可以.GetSize()从两个子结构中获取 size 的值,但是我在 channel 字段上没有同样的成功.GetChannel()(*ndr,我用它在 goroutines 和它们的调用者之间进行通信)...我明白了 t.GetChannel undefined (type Measurable has no field or method GetChannel)它可能有助于逻辑的演示:package mainimport (    "fmt")type Measurable interface {    GetSize() int}type Thing struct {    Size int    Out  chan int}type Something struct{ *Thing }type Otherthing struct{ *Thing }func newThing(size int) *Thing {    return &Thing{        Size: size,        Out:  make(chan int),    }}func NewSomething(size int) *Something   { return &Something{Thing: newThing(size)} }func NewOtherthing(size int) *Otherthing { return &Otherthing{Thing: newThing(size)} }func (s *Thing) GetSize() int         { return s.Size }func (s *Thing) GetChannel() chan int { return s.Out }func main() {    things := []Measurable{}    pen := NewSomething(7)    paper := NewOtherthing(5)    things = append(things, pen, paper)    for _, t := range things {        fmt.Printf("%T %d \n", t, t.GetSize())    }    for _, t := range things {        fmt.Printf("%+v \n", t.GetChannel())    }    // for _, t := range things {    // fmt.Printf("%+v", t.Thing.Size)    // }}注释代码是我正在尝试学习的另一件事。我可以通过使用在超类型上声明的方法来获取值,但不能直接从子类型访问。当然,我可以解决类型,t.(*bothTheThingTypes).Size但我失去了动态性,我没有完全理解这个......
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

我想了解的是为什么我可以从两个子结构中获取 size .GetSize() 的值,但是我在通道字段 .GetChannel() 上没有同样的成功


type Measurable interface {

    GetSize() int

}


...


things := []Measurable{}

for _, t := range things {

    fmt.Printf("%+v \n", t.GetChannel())

}

我可能忽略了这一点,但这似乎是由于您的Measurable界面没有GetChannel方法这一事实造成的


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信