Go 語言程式:建立名為 Worker 的介面,定義 Work 方法


Go 語言中的 Work 方法是使用者為自定義資料型別定義的方法,用於執行各種操作。您可以選擇任何名稱,但功能將取決於具體需求。不同的型別可以實現 Worker 介面,從而提供 Work 行為的不同用法。這裡我們將使用三種不同的方法:直接介面實現、結構體嵌入以及介面斷言,並透過示例來詳細說明這個概念。在本文中,我們將研究如何在 Go 中建立一個名為 Laborer 的介面,該介面指定一個 Work 方法。

語法

type Animal interface {Work() string}

語法型別 `Animal interface { Speak() string }` 在 Go 中定義了一個名為 Animal 的介面,它指定實現此介面的任何型別都必須具有一個名為 Speak 的方法,該方法不帶引數並返回一個字串。

type OuterStruct struct

OuterStruct 透過將 EmbeddedStruct 作為欄位包含在 OuterStruct 中來嵌入 EmbeddedStruct。

EmbeddedStruct

嵌入式結構體的欄位和方法可以在 OuterStruct 中自動訪問。

func (o OuterStruct)

可以定義 OuterStruct 特有的方法,並且可以使用 o.EmbeddedStruct.Method() 訪問 EmbeddedStruct 的方法。

value, ok := variable.(InterfaceType)

語法 `value, ok := variable.(InterfaceType)` 用於 Go 中的介面斷言。它嘗試斷言儲存在 variable 中的值實現了 InterfaceType,如果成功,則將斷言的值賦給 value 並將 ok 設定為 true;否則,ok 設定為 false。

演算法

  • 步驟 1 − 宣告一個名為 Worker 的介面,其中包含單個方法簽名:Work()。

  • 步驟 2 − 實現不同的型別,例如 Manager、Engineer 等,這些型別透過提供自己的 Work 方法實現來滿足 Worker 介面。

  • 步驟 3 − 在 main 函式或任何其他相關上下文中,建立各種工作程式型別的例項,並將它們分配給 Worker 型別的變數。

  • 步驟 4 − 在每個 worker 變數上呼叫 Work 方法。由於所有 worker 型別都實現了 Worker 介面,因此將根據底層型別呼叫相應的 Work 方法實現。

  • 步驟 5 − 對您想要包含的任何其他 worker 例項或型別重複步驟 4。

  • 步驟 6 − 您可以選擇執行型別斷言或使用型別開關來檢查每個 worker 例項的特定型別。

  • 步驟 7 − 執行程式並觀察輸出,這將根據底層 worker 型別演示不同的工作行為。

示例 1

在這個程式碼示例中,我們定義了一個名為 Worker 的介面,它包含一個名為 Work() 的方法。我們建立了兩種型別,Manager 和 Engineer,它們透過提供自己的 Work() 方法實現來實現 Worker 介面,並列印相應的輸出。

package main

import "fmt"

type Worker interface {
   Work()
}

type Manager struct{}

func (m Manager) Work() {
   fmt.Println("Manager is working...")
}

type Engineer struct{}

func (e Engineer) Work() {
   fmt.Println("Engineer is working...")
}

func main() {
   manager := Manager{}
   engineer := Engineer{}

   manager.Work()
   engineer.Work()
}

輸出

Manager is working...
Engineer is working...

示例 2

此程式碼演示了 Go 中的結構體嵌入。它定義了一個名為 Worker 的介面,其中包含一個 Work() 方法。該程式碼包含一個名為 EmbeddedStruct 的結構體,它有自己的 Work() 方法實現。建立另一個名為 OuterStruct 的結構體,它嵌入 EmbeddedStruct。OuterStruct 結構體繼承了 EmbeddedStruct 的 Work() 方法。此示例展示瞭如何使用結構體嵌入來實現介面並從嵌入式結構體繼承方法。

package main

import "fmt"

type Worker interface {
   Work()
}

type EmbeddedStruct struct{}

func (e EmbeddedStruct) Work() {
   fmt.Println("EmbeddedStruct is working...")
}

type OuterStruct struct {
   EmbeddedStruct
   // Other fields specific to OuterStruct
}

func main() {
   outer := OuterStruct{}

   outer.Work() // Output: EmbeddedStruct is working...
}

輸出

EmbeddedStruct is working...

示例 3

此程式碼演示了 Go 中的介面斷言。它首先宣告一個名為 Worker 的介面,其中包含一個 Work() 方法。透過其各自的 Work() 方法實現,實現了兩種型別 Manager 和 Engineer。在 main() 函式中,透過介面斷言建立 Manager 和 Engineer 的例項並將其分配給 Worker 型別的變數。

package main

import "fmt"

type Worker interface {
   Work()
}

type Manager struct{}

func (m Manager) Work() {
   fmt.Println("Manager is working...")
}

type Engineer struct{}

func (e Engineer) Work() {
   fmt.Println("Engineer is working...")
}

func main() {
   manager := Manager{}
   engineer := Engineer{}

   var worker1 Worker = manager
   var worker2 Worker = engineer

   if value, ok := worker1.(Manager); ok {
      value.Work()
   }

   if value, ok := worker2.(Engineer); ok {
      value.Work()
   }
}

輸出

Manager is working...
Engineer is working...

結論

在本文中,我們學習瞭如何在 Go 中建立一個名為“Specialist”的介面,幷包含一個“Work”方法。透過定義一個介面並使用不同的結構體型別來實現它,我們實現了多型行為,允許交換不同型別的物件。“Laborer”介面提供了一個契約,確保任何實現它的型別都將具有一個“Work”方法。這種靈活性使我們能夠編寫更模組化和可擴充套件的程式碼。

更新於:2023年7月20日

92 次瀏覽

啟動您的 職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.