亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何遍歷不同結構類型的值并在每個上調用相同的方法?

如何遍歷不同結構類型的值并在每個上調用相同的方法?

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 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號