”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何管理具有共享字段的类似 Go 结构的函数?

如何管理具有共享字段的类似 Go 结构的函数?

发布于2024-11-08
浏览:758

How to Manage Functions for Similar Go Structs with Shared Fields?

Go 最佳实践:管理具有共享字段的相似结构体的函数

在 Go 中,经常会遇到具有相似字段的多个结构体,并且需要对它们执行相同的操作。为了在保持灵活性的同时避免代码重复,请考虑以下策略:

为共享字段创建自定义类型:

如果共享字段是简单数据类型 (例如,字符串),考虑为其定义自定义类型。这允许您将方法附加到自定义类型,然后嵌入该类型的任何结构都可以使用该方法。

type Version string

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

然后,将 Version 类型嵌入到结构体中:

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

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

这允许您使用 Version 字段上的 PrintVersion 方法打印版本:

g.PrintVersion()
e.PrintVersion()

使用反射:

如果共享字段可以是不同的类型或者如果您想要更大的灵活性,您可以使用反射来动态调用适当的方法。这种方法比较复杂,并且会产生一些性能影响,但它提供了更大的灵活性。

type Printer interface {
    PrintVersion() error
}

func PrintVersion(p Printer) error {
    t := reflect.TypeOf(p)
    method, ok := t.MethodByName("PrintVersion")
    if !ok {
        return fmt.Errorf("object doesn't have a PrintVersion method")
    }

    return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}

然后您可以使用 PrintVersion 函数在任何实现 Printer 接口的对象上调用 PrintVersion 方法:

var game Game
var erp ERP

PrintVersion(game)
PrintVersion(erp)
最新教程 更多>
  • ## 为什么我不能在 Go 中只复制带有指针接收器的类型实例?
    ## 为什么我不能在 Go 中只复制带有指针接收器的类型实例?
    了解指针接收器和复制实例在 Go 中,可以使用值接收器或指针接收器来定义方法。当类型 T 的所有方法都有 T 本身的接收者类型时,复制该类型的实例是安全的,因为调用其任何方法都必然会进行复制。然而,当类型有带有指针接收器的方法。在这种情况下,应避免复制该类型的实例,因为它可能违反内部不变量。复制指针...
    编程 发布于2024-11-08
  • Java 中的构造函数重载
    Java 中的构造函数重载
    构造函数在初始化类中起着至关重要的作用。但您是否知道在 Java 中,一个类可以有多个构造函数?这个概念称为构造函数重载,该功能允许您根据提供的参数以不同的方式创建对象。在本文中,我们将深入探讨构造函数重载,探讨其好处,并查看实际示例。 什么是构造函数重载? 构造函数重载在Java中...
    编程 发布于2024-11-08
  • 如何使用 Python 库维护 JSON 对象中键的顺序?
    如何使用 Python 库维护 JSON 对象中键的顺序?
    使用 Python 库保留 JSON 对象属性的顺序使用 json.dumps 将 Python 对象转换为 JSON 字符串时,输出 JSON 对象中键的顺序可能与输入 Python 对象中键的原始顺序不一致。如果需要特定的键顺序,这可能会出现问题。要解决此问题,您可以利用某些 Python 库,...
    编程 发布于2024-11-08
  • ## 什么是 __construct 方法以及它在 PHP 中如何工作?
    ## 什么是 __construct 方法以及它在 PHP 中如何工作?
    理解__construct在类定义中的作用在面向对象编程中,__construct方法在类定义中起着至关重要的作用。它作为构造函数,负责在创建对象时初始化和设置对象的属性。什么是 __construct?__construct 是 PHP5 中引入的一个特殊方法每当从类实例化新对象时都会自动调用它。...
    编程 发布于2024-11-08
  • 使用 Python 进行词嵌入:Wordc
    使用 Python 进行词嵌入:Wordc
    使用 Python(和 Gensim)实现 word2vec 注意:此代码是用Python 3.6.1(Gensim 2.3.0)编写的 word2vec与Gensim的Python实现及应用 原始论文:Mikolov, T.、Chen, K.、Corrado, G. 和 Dean...
    编程 发布于2024-11-08
  • 如何解决 C# 中 MySQL UTF-8 数据的编码问题?
    如何解决 C# 中 MySQL UTF-8 数据的编码问题?
    MySQL 和 C# 中的编码问题在您的项目中,从以 UTF 编码的 MySQL 数据库检索数据时遇到字符差异-8 使用ADO.Net实体框架。具体来说,像“ë”这样的字符显示为“à”。可能的解决方案要纠正此问题,有两个关键步骤: 1。验证数据库排序规则确保数据库或表的排序规则设置为 UTF-8 排...
    编程 发布于2024-11-08
  • 适合初学者的 VueJs VueJs 部分创建、导入和使用组件
    适合初学者的 VueJs VueJs 部分创建、导入和使用组件
    创建您的第一个组件 什么是组件? 组件是 Vue 应用程序的构建块。每个组件都有自己的功能和视图,组件可以在整个应用程序中重用。组件的一个示例是可以在不同页面上访问的导航栏。 创建基本组件 在组件文件夹中创建一个名为 HelloWorld.vue 的新组件文件(如果需要,您可以更改...
    编程 发布于2024-11-08
  • 如何在Python中为共享模块创建命名空间包?
    如何在Python中为共享模块创建命名空间包?
    在 Python 中创建命名空间包以进行共享模块分发简介在 Python 中,命名空间包是分发相关模块的便捷方法。它们使多个 Python 产品能够在同一命名空间中定义模块,从而允许最终用户无缝导入它们。实现命名空间包Python 3.3 中的隐式命名空间包从Python 3.3开始,引入了隐式命名...
    编程 发布于2024-11-08
  • 数据库设计中“n:m”和“1:n”关系有什么区别?
    数据库设计中“n:m”和“1:n”关系有什么区别?
    数据库设计:阐明“n:m”和“1:n”关系的含义在数据库设计领域,实体之间的关系是根本性的。理解用于描述这些关系的符号对于创建健壮且高效的数据库结构至关重要。两个常见的符号是“n:m”和“1:n”。n:m 关系:多对多连接An "n :m”关系表示两个表之间的多对多关系。这意味着一个表中的...
    编程 发布于2024-11-08
  • 如何在 CSS 中缩进后续换行标签行?
    如何在 CSS 中缩进后续换行标签行?
    缩进换行标签文本的后续行当面临表单宽度的限制时,标签文本可以换行到多行,从而美观的担忧。虽然第一行由于输入元素的存在而缩进,但后续行可能不会缩进,从而产生不均匀的外观。要仅使用 CSS 实现缩进的第二行和后续行,请考虑使用以下方法:将输入元素及其标签包含在具有类 “checkbox-field” 的...
    编程 发布于2024-11-08
  • 掌握 CSS 中的 box-shadow:快速指南
    掌握 CSS 中的 box-shadow:快速指南
    CSS 中的 box-shadow 属性是开发人员向 HTML 元素引入深度和维度的有效机制。通过将阴影合并到元素中,可以增强用户界面的真实感和视觉吸引力。本文将深入探讨 box-shadow 的基础知识,并提供示例来帮助您掌握其应用。 了解基础知识 box-shadow 属性由几...
    编程 发布于2024-11-08
  • 冒烟测试:快速高效的质量检查
    冒烟测试:快速高效的质量检查
    冒烟测试是软件测试中至关重要的初始阶段,旨在快速识别可能阻止进一步测试或开发的关键缺陷。它充当安全网,确保软件在投入大量资源进行更全面的测试工作之前处于稳定状态。 了解冒烟测试 冒烟测试是一种高级测试套件,用于验证软件应用程序的基本功能。它专注于核心功能,并确保应用程序可以启动、导航和使用,而不会...
    编程 发布于2024-11-08
  • 避免代码中的错误:Moment.js 中的变异方法与非变异方法
    避免代码中的错误:Moment.js 中的变异方法与非变异方法
    使用 Moment.js 时,必须了解哪些方法更改原始日期对象以及哪些方法返回新值。这可以帮助您避免代码中出现意外的副作用。这是一个快速指南: ?改变原始日期对象的方法: startOf(unit) — 将日期设置为指定单位的开始日期(例如,“年”、“月”、“日”)。 endOf(unit) — 将...
    编程 发布于2024-11-08
  • SQL 中的反引号与单引号:主要区别是什么以及何时应该使用它们?
    SQL 中的反引号与单引号:主要区别是什么以及何时应该使用它们?
    SQL 查询中的反引号与单引号在 CodeIgniter 手册摘录中,提到 $this->db->select () 方法接受可选的第二个参数以禁用字段和表名称的反引号保护。这就提出了三个问题:1。反引号(`)和单引号(')有什么区别?MySQL中反引号引用名称,而单引号括住字符串。使用不带...
    编程 发布于2024-11-08
  • MLP-混合器(理论)
    MLP-混合器(理论)
    TL;DR - This is the first article I am writing to report on my journey studying the MPL-Mixer architecture. It will cover the basics up to an intermed...
    编程 发布于2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3