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

我会尽量把它说清楚,首先在我的脑海里。


我有一个接口和几个通过声明方法继承它的类型。非常漂亮和聪明的继承方式。


然后我有一个“超级” 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 main


import (

    "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但我失去了动态性,我没有完全理解这个......


慕桂英3389331
浏览 188回答 1
1回答

繁星点点滴滴

我想了解的是为什么我可以从两个子结构中获取 size .GetSize() 的值,但是我在通道字段 .GetChannel() 上没有同样的成功type Measurable interface {    GetSize() int}...things := []Measurable{}for _, t := range things {    fmt.Printf("%+v \n", t.GetChannel())}我可能忽略了这一点,但这似乎是由于您的Measurable界面没有GetChannel方法这一事实造成的
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go