为了账号安全,请及时绑定邮箱和手机立即绑定

GO 使用接口作为字段

GO 使用接口作为字段

Go
叮当猫咪 2021-06-09 19:46:53
我正在阅读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
提交
取消
意见反馈 帮助中心 APP下载
官方微信