【发布时间】:2014-09-08 17:44:02
【问题描述】:
当附近发生爆炸时,我试图代表一个在窗户附近戴眼镜的人。 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
【问题讨论】:
-
如果您不希望
Human具有Shatter方法,请使用type Human struct { Glasses Glasses }。用机械术语(它们对暴露的 API 执行 X、Y 和 Z)而不是人类语言中的嵌入(以及就此而言,继承)更容易想到。 -
这个问题让我的一天变得难以置信地亮了????谢谢@dog