2

An Introduction to Programming in 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 を含めることができます。

これの使い方がわかりません。これについての私の理解は、その中にandを含めることがMultiShapeできるということですCircleRectangleslice

これは私が取り組んでいるサンプルコードです

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のバックグラウンドを持っているので、2つの間に何らかのリンクがあれば役立ちます。

ありがとう

4

1 に答える 1

2

例えば、

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
}

type Rectangle struct {
    x1, y1, x2, y2 float64
}

func (s *Rectangle) area() float64 {
    x := math.Abs(s.x2 - s.x1)
    y := math.Abs(s.y2 - s.y1)
    return x * y
}

func (s *Rectangle) distance() float64 {
    x := s.x2 - s.x1
    y := s.y2 - s.y1
    return math.Sqrt(x*x + y*y)
}

type Circle struct {
    x, y, r float64
}

func (s *Circle) area() float64 {
    return math.Pi * s.r * s.r
}

func main() {
    r1 := Rectangle{1, 1, 4, 4}
    fmt.Println(r1.area())
    r2 := Rectangle{2, 4, 3, 6}
    fmt.Println(r2.area())
    c := Circle{10, 10, 2}
    fmt.Println(c.area())
    m := MultiShape{[]Shape{&r1, &r2, &c}}
    fmt.Println(m.area())
}

出力:

9
2
12.566370614359172
23.566370614359172
于 2013-07-03T01:02:31.683 に答える