”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在具有共享字段的结构上实现相同的方法时如何避免代码重复?

在具有共享字段的结构上实现相同的方法时如何避免代码重复?

发布于2024-11-19
浏览:840

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
}

通过采用这种方法,可以消除与重复方法相关的代码重复,同时保持灵活性和类型安全性。

最新教程 更多>
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于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 应用程序的需要,例如当事件处理程序被关闭时触发以启动重新启动。本文深入探讨了重新启动 AWT 应用程序的实用方法,反映了 C# 中 Application.Restart() 的功能。重生技术重新启动 Java应用程序...
    编程 发布于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 Beyon...
    编程 发布于2024-11-19

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3