我正在阅读Go 编程简介并尝试掌握接口。我觉得我很清楚它们是什么以及为什么我们需要它们,但我在使用它们时遇到了麻烦。在本节的末尾,他们有接口也可以用作字段:type MultiShape struct { shapes []Shape}我们甚至可以通过给它一个 area 方法将 MultiShape 本身变成一个 Shape:func (m *MultiShape) area() float64 { var area float64 for _, s := range m.shapes { area += s.area() } return area}现在 MultiShape 可以包含圆形、矩形甚至其他 MultiShape。我不知道如何使用这个。我对此的理解是MultiShape可以有一个Circle和Rectangle在它的slice这是我正在使用的示例代码package mainimport ("fmt"; "math")type Shape interface { area() float64}type MultiShape struct { shapes []Shape}func (m *MultiShape) area() float64 { var area float64 for _, s := range m.shapes { area += s.area() } return area}// ===============================================// Rectanglestype Rectangle struct { x1, y1, x2, y2 float64}func distance(x1, y1, x2, y2 float64) float64 { a := x2 - x1 b := y2 - y1 return math.Sqrt(a*a + b*b)}func (r *Rectangle) area() float64 { l := distance(r.x1, r.y1, r.x1, r.y2) w := distance(r.x1, r.y1, r.x2, r.y1) return l*w}// ===============================================// Circlestype Circle struct { x, y, r float64}func (c * Circle) area() float64 { return math.Pi * c.r*c.r}// ===============================================func totalArea(shapes ...Shape) float64 { var area float64 for _, s := range shapes { area += s.area() } return area}func main() { c := Circle{0,0,5} fmt.Println(c.area()) r := Rectangle{0, 0, 10, 10} fmt.Println(r.area()) fmt.Println(totalArea(&r, &c)) //~ This doesn't work but this is my understanding of it //~ m := []MultiShape{c, r} //~ fmt.Println(totalArea(&m))}有人可以帮我弄这个吗?我有 python 背景,所以如果两者之间有某种联系会有所帮助。
1 回答
- 1 回答
- 0 关注
- 281 浏览
添加回答
举报
0/150
提交
取消