猿问

GO 使用接口作为字段

我正在阅读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 main


import ("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

}


// ===============================================

// Rectangles


type 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

}


// ===============================================

// Circles


type 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 背景,所以如果两者之间有某种联系会有所帮助。


叮当猫咪
浏览 282回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答