Go語言中將介面型別作為值和指標傳遞給函式


在 Go 中,常見的是編寫接受介面作為引數或接受介面指標的函式。當您希望編寫適用於滿足特定介面的任何型別的通用程式碼時,這非常有用。

接受介面型別作為值的函式

在 Go 中,介面被定義為一組方法。如果某個型別實現了介面的所有方法,則稱該型別滿足該介面。這意味著該型別可以在任何需要該介面的地方使用。

以下是一個接受介面型別作為值的函式示例:

示例

package main

import "fmt"

type Shape interface {
   Area() float64
}

type Circle struct {
   Radius float64
}

func (c Circle) Area() float64 {
   return 3.14 * c.Radius * c.Radius
}

func PrintArea(s Shape) {
   fmt.Println("Area:", s.Area())
}

func main() {
   c := Circle{Radius: 5}
   PrintArea(c)
}

輸出

Area: 78.5

在此示例中,我們定義了一個名為 Shape 的介面,它只有一個方法 Area() float64。我們還定義了一個 Circle 型別,它透過定義 Area() 方法實現了 Shape 介面。最後,我們定義了一個名為 PrintArea 的函式,它接受 Shape 介面的值作為引數並列印其面積。

在 main 函式中,我們建立了一個 Circle 型別的例項,並將其作為引數傳遞給 PrintArea 函式。由於 Circle 滿足 Shape 介面,因此它可以作為 PrintArea 函式的引數使用。

接受介面型別作為指標的函式

在 Go 中,常見的是編寫接受介面指標作為引數的函式。當您希望修改底層值的 state 時,這非常有用。

以下是一個接受介面指標的函式示例:

示例

package main

import "fmt"

type Shape interface {
   Area() float64
}

type Circle struct {
   Radius float64
}

func (c Circle) Area() float64 {
   return 3.14 * c.Radius * c.Radius
}

func PrintArea(s Shape) {
   fmt.Println("Area:", s.Area())
}

func main() {
   c := Circle{Radius: 5}
   s := Shape(c)
   PrintArea(s)
}

輸出

Area: 78.5

在此示例中,我們定義了一個名為 Shape 的介面,它只有一個方法 Area() float64。我們還定義了一個 Circle 型別,它透過定義 Area() 方法實現了 Shape 介面。

然後,我們定義了一個名為 PrintArea 的函式,它接受 Shape 介面的指標作為引數並列印其面積。在 main 函式中,我們建立了一個 Circle 型別的例項,並將指向它的指標賦值給 Shape 型別的變數。然後,我們將指向此變數的指標作為引數傳遞給 PrintArea 函式。

請注意,當我們定義 PrintArea 函式時,我們使用 Shape 介面的指標作為其引數。這使我們能夠修改底層值的 state。在本例中,我們實際上並沒有修改該值,但如果需要,我們可以這樣做。

結論

編寫接受介面作為引數或接受介面指標的函式是 Go 的一個強大功能,它允許您編寫適用於滿足特定介面的任何型別的通用程式碼。

更新於: 2023年4月18日

1K+ 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.