我会尽量把它说清楚,首先在我的脑海里。我有一个接口和几个通过声明方法继承它的类型。非常漂亮和聪明的继承方式。然后我有一个“超级” 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方法这一事实造成的
- 1 回答
- 0 关注
- 187 浏览
添加回答
举报
0/150
提交
取消