」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 在具有共享字段的結構上實現相同的方法時如何避免程式碼重複?

在具有共享字段的結構上實現相同的方法時如何避免程式碼重複?

發佈於2024-11-19
瀏覽:797

How to Avoid Code Duplication When Implementing Identical Methods on Structs with Shared Fields?

在具有相同字段的結構體中使用通用函數的最佳實踐

在兩個結構體擁有相同字段的情況下,最好防止定義對這些欄位進行操作的方法時會出現程式碼重複。

自訂類型作為方法接收器

建議的方法是引入一個自訂類型(例如,Version)來服務作為方法接收者。由於所有自訂類型都可以用作方法接收器,因此此技術可以建立可應用於多個結構的單一方法。

組合

一旦自訂類型被定義後,可以使用組合將其合併到結構中。這涉及在結構中嵌入自訂類型,本質上是創建一個嵌套結構。

範例

考慮以下程式碼片段:

type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}

type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}

這裡,Version 類型充當方法接收者,由於其嵌入的 Version 字段,它的 PrintVersion 方法可以被 Game 和 ERP 結構體存取。

用法

嵌入的 Version 欄位可以像任何其他欄位一樣使用和修改:

main() {
    g := Game{
        "Fear Effect",
        false,
        "Action-Adventure",
        "1.0.0",
    }

    g.PrintVersion() // Version is 1.0.0

    e := ERP{
        "Logo",
        true,
        []string{"ms-sql"},
        "2.0.0",
    }

    e.PrintVersion() // Version is 2.0.0
}

透過採用這種方法,可以消除與重複方法相關的程式碼重複,同時保持靈活性和類型安全性。

最新教學 更多>
  • 如何在 C++ 中對所有可變參數模板參數呼叫函數?
    如何在 C++ 中對所有可變參數模板參數呼叫函數?
    C 可變參數模板:在所有模板參數上調用函數在C 中,通常需要迭代可變參數模板參數並執行特定操作,例如調用一個函數。這可以使用以下任一方法來實現:C 17 Fold Expression(f(args), ...);但是,如果被呼叫的函數可能傳回一個物件對於重載的逗號運算符,您應該使用:((void)...
    程式設計 發佈於2024-11-19
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內容...
    程式設計 發佈於2024-11-19
  • 如何在Go中有效率且簡單地複製檔案?
    如何在Go中有效率且簡單地複製檔案?
    Go 中高效簡單的文件複製在Go 中高效複製文件,無需借助複雜的庫或依賴於操作系統的代碼,可以使用處理各種邊緣情況的強大實現來實現。 使用硬連結實現快速複製複製現有文件的快速方法是使用 os.Link() 函數。這會在原始文件和目標文件之間創建硬鏈接,本質上使它們成為同一文件而不是創建副本。這種方法...
    程式設計 發佈於2024-11-19
  • 何時以及為何應在 JavaScript 變數名稱中使用美元符號?
    何時以及為何應在 JavaScript 變數名稱中使用美元符號?
    揭示美元符號在JavaScript 中的作用:變數命名指南在JavaScript 領域,美元符號($) 經常出現出現在變數名稱旁邊,激發了新手編碼人員的好奇心。為什麼這個神秘的符號?我們可以簡單地取消它嗎? 兩個符號的故事美元符號,就像下劃線(_)一樣,在 JavaScript 眼中沒有固有的意義。...
    程式設計 發佈於2024-11-19
  • 為什麼早期 C++11 草案中沒有預設移動實作?
    為什麼早期 C++11 草案中沒有預設移動實作?
    為什麼早期 C 11 草案中沒有預設移動實作? 在 C 11 標準的早期版本中,移動構造函數和賦值運算子的隱式生成是辯論的話題。這導致了後續草案的更改,導致目前可用的編譯器中出現以下行為:隱式移動語義自11 月發布C 標準(N3225) 以來,隱式移動構造函數和賦值運算子可以在以下條件下產生:該類別...
    程式設計 發佈於2024-11-19
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-19
  • 如何像 C# 中的 Application.Restart() 一樣重新啟動 Java 應用程式?
    如何像 C# 中的 Application.Restart() 一樣重新啟動 Java 應用程式?
    重新啟動Java 應用程式:綜合解決方案重新啟動Java 應用程式:綜合解決方案在各種場景中都會出現重新啟動Java 應用程式的需要,例如當事件處理程序關閉時觸發以啟動重新啟動。本文深入探討了重新啟動 AWT 應用程式的實用方法,反映了 C# 中 Application.Restart() 的功能。...
    程式設計 發佈於2024-11-19
  • 在 Python 異常處理中什麼時候應該使用 Try-Except 而不是 If-Else?
    在 Python 異常處理中什麼時候應該使用 Try-Except 而不是 If-Else?
    異常處理中的Try-Except 與If-Else在Python 程式設計中,使用try- except 區塊與if 之間會出現困境-else 語句來處理異常。雖然這兩種方法都是有效的,但某些因素有利於在特定場景中使用 try-except。 有利於Try-Except 的情況:效能增強: 在操作可...
    程式設計 發佈於2024-11-19
  • 如何將 CSS 樣式套用到 jsPDF 文件?
    如何將 CSS 樣式套用到 jsPDF 文件?
    解決 jsPDF 的 CSS 問題您在將 CSS 應用於 jsPDF 文件時面臨著挑戰​​。本指南將根據您提供的資訊深入研究潛在的解決方案。 了解 CSS 包含如上所述,您已經使用了內聯、內部和外部樣式表,但沒有效果。不幸的是,jsPDF 本身並不支援 CSS 應用。 利用列印 CSS 檔案一些論壇...
    程式設計 發佈於2024-11-19
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-19
  • 如何在Python中取得檔案的絕對路徑?
    如何在Python中取得檔案的絕對路徑?
    在 Python 中確定絕對文件路徑作為程式設計師,確定文件的絕對路徑通常是至關重要的。絕對路徑提供檔案的完整位址,包括其磁碟機、目錄和檔案名稱。在 Python 中,取得絕對路徑非常簡單,並且跨平台保持一致。 為了檢索給定檔案的絕對路徑,Python 提供了 os.path.abspath() 函...
    程式設計 發佈於2024-11-19
  • 如何使用 Joda Time 將日期字串轉換為 DateTime 物件?
    如何使用 Joda Time 將日期字串轉換為 DateTime 物件?
    使用Joda Time 將日期字串轉換為DateTime 物件嘗試轉換類似「04/02/2011 20:27」的日期字串時:05" 使用new DateTime("04/02/2011 20:27:05") 到DateTime 對象,由於格式不匹配,可能會出現錯誤。為了...
    程式設計 發佈於2024-11-19
  • 如何在 PHP 中將多維數組展平為一維數組?
    如何在 PHP 中將多維數組展平為一維數組?
    將多維數組轉換為一維數組:PHP 解決方案在PHP 中,遇到包含單元素數組的數組可以進行轉換當旨在獲得一維等價物時面臨挑戰。為了解決這種情況,讓我們探討如何使用內建 PHP 功能有效地展平此類陣列。 1。 array_map('current', $array):對於具有單元素子數組...
    程式設計 發佈於2024-11-19
  • 如何在沒有反向引用的情況下匹配 Go 中的重複字元?
    如何在沒有反向引用的情況下匹配 Go 中的重複字元?
    如何在 Go 中使用正規表示式來匹配任意重複字元? 在本文中,我們將解決匹配任意重複字元的挑戰在 Go 中使用正規表示式重複兩次。在其他正規表示式語法(例如 JavaScript)中,此任務通常很簡單,其中可以簡單地使用反向引用來匹配重複字元。然而,Go 的原生正規表示式引擎 (re2) 不支援反向...
    程式設計 發佈於2024-11-19
  • 如何偵錯 PDO 查詢錯誤:我們可以重建「最終」查詢嗎?
    如何偵錯 PDO 查詢錯誤:我們可以重建「最終」查詢嗎?
    如何深入探究PDO 查詢錯誤的奧秘傳統的PHP 連接SQL 查詢允許透過手動查詢輕鬆進行語法錯誤調試執行時,準備好的PDO 語句的出現帶來了一個獨特的挑戰:缺乏可見的「最終」查詢字串。當資料庫語法錯誤發生時,這可能會讓開發人員摸不著頭腦。 Is the Eluding Query Beyond Gr...
    程式設計 發佈於2024-11-19

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3