接口和将匿名字段嵌入到结构中

时间:2014-09-08 17:44:02

标签: interface go

当附近发生爆炸时,我试图代表靠近窗户的人戴眼镜。 main是爆炸期间应​​该做什么的草图。有些东西应该收集爆炸附近的物体清单,并为每个物体做特定的事情(例如粉碎或熔化)。玻璃和窗户如预期的那样破碎,但出于某种原因,人类也会破碎。为什么呢?

package main
import "fmt"
type Human struct { Glasses }
type Glasses struct {}
type Shatterable interface { shatter() }
func (g Glasses) shatter() {}
type Window struct {}
func (w Window) shatter() {}

func main() {
    h := Human{Glasses{}}
    objectsInProximity := []interface{}{h,h.Glasses,Window{}}
    for _,o := range objectsInProximity {
        shatter(o)
    }
}

func shatter(i interface{}) {
    s, ok := i.(Shatterable)
    if ok {
        fmt.Printf("shattering a %T\n", s)
        s.shatter()
    }
}

$ go run a.go
shattering a main.Human
shattering a main.Glasses
shattering a main.Window

1 个答案:

答案 0 :(得分:6)

this thread中所述:

  

我们正在讨论结构的匿名字段   (http://golang.org/ref/spec#Struct_types)。

(修改后的版本,因为术语超集令人困惑)

具有匿名字段的结构符合每个接口,其中包含匿名字段或结构本身声明的所有接口方法

type Human struct { Glasses }

由于Glasses可以破坏,Human也可以满足相同的界面。


注意:在结构中嵌入匿名字段最接近"继承",即使答案为" Golang: what's the point of interfaces when you have multiple inheritance"提醒我们:

  

Go没有继承权   如果Man扩展了' Human(通过将其作为匿名字段),任何使用Human作为参数的方法都无法将Man作为参数。

(这意味着这里Human延伸...... Glasses?!这可能会显示某种设计缺陷)

我之前在" If struct A is embedded in B, can methods on A access method and fields of B?"这不是真正的子类型。

  

接口使功能具有“占位符”功能。参数可以采用不同的结构作为参数。

此处,如果Human不应该被粉碎,则不应包含匿名字段Glasses