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

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

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

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)
最新教程 更多>
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    在node-mysql node-mysql文档最初出于安全原因最初禁用多个语句支持,因为它可能导致SQL注入攻击。要启用此功能,您需要在创建连接时将倍增设置设置为true: var connection = mysql.createconnection({{multipleStatement:...
    编程 发布于2025-04-15
  • 永不遗忘防抖与节流,附Codepen可视化
    永不遗忘防抖与节流,附Codepen可视化
    这不仅是另一篇文章,试图解释如何在代码级别上工作,而是要记住和可视化概念的例证,以便您可以在工作中实际应用它们。 就个人而言,我经常发现自己忘记了辩论和节奏的概念,所以当有人要求我解释它们时,或者是否在采访中出现了问题 - 我只是眨眼?为了避免这种情况,我制作了一个简单的页面来帮助刷新我的记忆。如果...
    编程 发布于2025-04-15
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-04-15
  • CSS能否实现无if/else的条件逻辑?
    CSS能否实现无if/else的条件逻辑?
    1。 CSS类:通过利用HTML类,您可以为不同方案创建不同的样式规则。例如,以下代码基于类分配不同的背景位置: 2。 CSS预处理器(例如,sass): 像SASS这样的预处理程序提供有条件的语句,可允许更复杂的条件: 3。 CSS自定义属性(变量): CSS中的自定义属性与变量相似,并在运...
    编程 发布于2025-04-15
  • SQL Server 2012身份列值为何跳到1001?
    SQL Server 2012身份列值为何跳到1001?
    SQL Server Identity列的值突然跳至1001:SQL Server 2012中的说明在SQL Server 2012中,用户遇到了一个有趣的问题,其中身份列值突然从一个序列列值跳到了1001个顺序模式(E.G.,1,1,1,1,1,1,3)要了解这种现象背后的原因,让我们深入研究...
    编程 发布于2025-04-15
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-04-15
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-15
  • Python中何时用"try"而非"if"检测变量值?
    Python中何时用"try"而非"if"检测变量值?
    使用“ try“ vs.” if”来测试python 在python中的变量值,在某些情况下,您可能需要在处理之前检查变量是否具有值。在使用“如果”或“ try”构建体之间决定。“ if” constructs result = function() 如果结果: 对于结果: ...
    编程 发布于2025-04-15
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-04-15
  • 处理Java HashMap中的"GC Overhead Limit Exceeded"错误
    处理Java HashMap中的"GC Overhead Limit Exceeded"错误
    要解决此问题,可以考虑使用“ -XMX1024M”增加增加堆大小或使用“ -XX:-XX:-USEGCOVERHEADLIMITILIMIT”来禁用错误检查。虽然第一种方法可以解决问题,但第二种方法可能会导致与堆相关的另一个OutofmemoryError。 ,而不是这些命令行参数,可以为小has...
    编程 发布于2025-04-15
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-04-15
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-04-15
  • 轻松分享DataFrame样本,使用`df.to_dict()`方法
    轻松分享DataFrame样本,使用`df.to_dict()`方法
    如何使用df.to_dict()轻松共享示例数据帧在询问与数据分析有关的问题时,包括可重复的数据样本对于有效响应至关重要。 df.to_dict() provides a practical and straightforward way to share data frames as part ...
    编程 发布于2025-04-15
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法时,您可能会出现错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && &&华氏度D...
    编程 发布于2025-04-15
  • 处理Python和MySQL中的Unicode和编码问题
    处理Python和MySQL中的Unicode和编码问题
    在Python和MySQL To address this issue, you have two options:Modifying the Database Table:You can modify the database table to use a Unicode-friendly ch...
    编程 发布于2025-04-15

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

Copyright© 2022 湘ICP备2022001581号-3