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

如何遍历不同结构类型的值并在每个上调用相同的方法?

如何遍历不同结构类型的值并在每个上调用相同的方法?

Go
慕勒3428872 2022-07-11 15:02:28
package mainimport (    "fmt"    "math")type Rect struct {    width  float64    height float64}type Circle struct {    radius float64}func (r Rect) Area() float64 {    return r.width * r.height}func (c Circle) Area() float64 {    return math.Pi * c.radius * c.radius}func main() {    rect := Rect{5.0, 4.0}    cir := Circle{5.0}    fmt.Printf("Area of rectangle rect = %0.2f\n", rect.Area())    fmt.Printf("Area of circle cir = %0.2f\n", cir.Area())}这个结构的基本常见示例。但我的问题是如何在多个时运行具有相同名称的 struct 方法。在此示例中,有 2 个结构。但是如果有 50 个结构(Circle, Rect, Foo, Bar ....)并且它们都有一个同名的方法(Area)。我如何在一个循环中同时动态地运行这些方法?也许我需要一个接口。我不知道。
查看完整描述

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())

}


查看完整回答
反对 回复 2022-07-11
?
慕尼黑8549860

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来消耗通道。这将导致死锁,因为在将所有区域写入通道后通道并未关闭。还有其他(也许更优雅)的方法来解决这个问题。


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信