2 回答
TA贡献1982条经验 获得超2个赞
使用 Area 方法的接口切片:
shapes := []interface{ Area() float64 }{Rect{5.0, 4.0}, Circle{5.0}}
for _, shape := range shapes {
fmt.Printf("Area of %T = %0.2f\n", shape, shape.Area())
}
TA贡献1818条经验 获得超11个赞
这实际上是两个问题:如何创建接口,以及如何同时运行一些东西。
定义接口很简单:
type Shape interface {
Area() float64
}
由于 Go 的魔力,每个Area() float64定义了函数的类型都会自动实现这个接口。
多亏了这个接口,我们可以将多个形状放入一个切片中:
shapes := []Shape{
Rect{5.0, 4.0},
Circle{5.0},
}
循环这个很容易:
for _, shape := range shapes {
// Do something with shape
}
同时打印该区域确实不是您想要做的事情。它提供了不可预测的输出,其中多行可能混合在一起。但是让我们假设我们同时计算这些区域,然后在最后打印它们:
areas := make(chan float64)
for _, shape := range shapes {
currentShape := shape
go func() { areas <- currentShape.Area() }()
}
for i := 0; i < len(shapes); i++ {
fmt.Printf("Area of shape = %0.2f\n", <-areas)
}
注意我们必须如何currentShape在循环内捕获局部变量,以避免它在 goroutine 有机会运行之前改变 goroutine 内的值。
还要注意我们如何不使用for area := range areas来消耗通道。这将导致死锁,因为在将所有区域写入通道后通道并未关闭。还有其他(也许更优雅)的方法来解决这个问题。
- 2 回答
- 0 关注
- 76 浏览
添加回答
举报