”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Go中不嵌入结构体可以实现方法继承吗?

Go中不嵌入结构体可以实现方法继承吗?

发布于2024-11-07
浏览:841

Can You Achieve Method Inheritance in Go Without Embedding Structs?

嵌入式结构:方法继承的探索

理解 Go 中的方法继承

In在 Go 中,将方法从一种类型继承到另一种类型的能力主要是通过嵌入结构来实现的。此技术涉及将一个结构嵌入另一个结构,允许外部结构访问和利用嵌入结构的方法。

嵌入结构的示例

考虑以下内容代码片段:

type Properties map[string]interface{}

func (p Properties) GetString(key string) string {
    return p[key].(string)
}

type Nodes map[string]*Node

type Node struct {
    *Properties
}

在此示例中,Node 结构嵌入 Properties 结构,创建复合数据结构。 Properties 结构定义了一个名为 GetString 的方法,该方法返回与给定键关联的字符串值。由于 Node 结构体嵌入了 Properties 结构体,因此可以直接访问和使用 GetString 方法,无需显式委托。

嵌入结构体的限制

嵌入结构体时继承方法是一种有效的方法,但它也有一定的局限性。一个关键限制是,在创建外部结构的实例时,必须显式初始化嵌入结构的字段。这可能会导致冗长和重复的代码,尤其是在处理复杂的数据结构时。

搜索替代方案

最初的询问寻求嵌入结构的替代方案来实现方法遗产。建议的解决方案涉及直接将 Properties 结构类型分配给 Node 结构,从而无需显式初始化嵌入结构。

type Properties map[string]interface{}

func (p Properties) GetString(key string) string {
    return p[key].(string)
}

type Nodes map[string]*Node

type Node Properties

替代方法的局限性

不幸的是,这种方法在 Go 中不可行,因为该语言不支持不嵌入结构体的直接方法继承的概念。 Go规范明确规定只能为特定的接收者类型声明方法,并且不能通过继承来修改接收者类型。

结论

在Go中,嵌入结构体仍然是方法继承的主要机制。虽然它有一定的局限性,但它提供了一种强大而有效的方法来创建具有共享功能的复合数据结构。尝试避免嵌入结构的替代方法可能会遇到限制并且不受语言规范的支持。

最新教程 更多>
  • mysqli_fetch_array() 何时显示错误“期望参数 1 为 mysqli_result,给定布尔值”?
    mysqli_fetch_array() 何时显示错误“期望参数 1 为 mysqli_result,给定布尔值”?
    mysqli_fetch_array() 期望 MySQLi 结果,而不是布尔值在给定的 PHP 代码中,错误“mysqli_fetch_array() 期望参数 1 为mysqli_result, boolean Give" 表示使用 mysqli_query() 的查询执行失败,它返回...
    编程 发布于2024-11-07
  • 子集和问题的 PHP 程序
    子集和问题的 PHP 程序
    子集和问题是计算机科学和动态规划中的经典问题。给定一组正整数和一个目标和,任务是确定是否存在给定集合的子集,其元素之和等于目标和。 子集和问题的PHP程序 使用递归解决方案 例子 <?php // A recursive solution for the subset sum problem ...
    编程 发布于2024-11-07
  • JavaScript 数组方法:综合指南
    JavaScript 数组方法:综合指南
    数组是 JavaScript 中最基本的数据结构之一。使用数组,您可以在单个变量中存储多个值。 JavaScript 提供了许多内置方法来操作数组,使它们具有令人难以置信的通用性。在这篇文章中,我们将探讨所有内置数组方法以及如何在 JavaScript 项目中有效地使用它们。 核心方...
    编程 发布于2024-11-07
  • 高级 T:依赖参数、推断联合以及 Twitter 上的健康交互。
    高级 T:依赖参数、推断联合以及 Twitter 上的健康交互。
    每次我用 TypeScript 写成 Foo 时,我都会感受到失败的沉重。 在一种情况下,这种感觉特别强烈:当函数采用的参数取决于哪个 "mode" 处于活动状态时。 通过一些示例代码更清晰: type Provider = "PROVIDER A" | "PR...
    编程 发布于2024-11-07
  • 如何创建人力资源管理解决方案
    如何创建人力资源管理解决方案
    1. Understanding the Basics of Frappe and ERPNext Task 1: Install Frappe and ERPNext Goal: Get a local or cloud-based instance of ERP...
    编程 发布于2024-11-07
  • 从周五黑客到发布:对创建和发布开源项目的思考
    从周五黑客到发布:对创建和发布开源项目的思考
    从周五补丁破解到发布:对创建和发布开源项目的思考 这是针对初学者和中级开发人员的系列的一部分,通过将他们的想法作为开源项目发布或引起兴趣。 这些想法是有偏见的和个人的。计划发布更多文章。通过分享一些思考,我希望能启发你做自己的项目 思考(此) 作为 Java 开发人员学习 Go l...
    编程 发布于2024-11-07
  • 可以使用 constexpr 在编译时确定字符串长度吗?
    可以使用 constexpr 在编译时确定字符串长度吗?
    常量表达式优化:可以在编译时确定字符串长度吗?在优化代码的过程中,开发人员尝试计算使用递归函数在编译时计算字符串文字的长度。此函数逐字符计算字符串并返回长度。初始观察:该函数似乎按预期工作,在运行时返回正确的长度并生成表明计算发生在编译时的汇编代码。这就提出了一个问题:是否保证length函数会在编...
    编程 发布于2024-11-07
  • 在 Raspberry Pi 上运行 Discord 机器人
    在 Raspberry Pi 上运行 Discord 机器人
    Unsplash 上 Daniel Tafjord 的封面照片 我最近完成了一个软件工程训练营,开始研究 LeetCode 的简单问题,并觉得如果我每天都有解决问题的提醒,这将有助于让我负起责任。我决定使用按 24 小时计划运行的不和谐机器人(当然是在我值得信赖的树莓派上)来实现此操作,该机器人将执...
    编程 发布于2024-11-07
  • 解锁 JavaScript 的隐藏宝石:未充分利用的功能可提高代码质量和性能
    解锁 JavaScript 的隐藏宝石:未充分利用的功能可提高代码质量和性能
    In the ever-evolving landscape of web development, JavaScript remains a cornerstone technology powering countless large-scale web applications. While...
    编程 发布于2024-11-07
  • 为什么通过非常量指针修改“const”变量看起来有效,但实际上并没有改变它的值?
    为什么通过非常量指针修改“const”变量看起来有效,但实际上并没有改变它的值?
    通过非常量指针修改 const在 C 中,const 变量一旦初始化就无法修改。但是,在某些情况下,const 变量可能会被更改。考虑以下代码:const int e = 2; int* w = (int*)&e; // (1) *w = 5; ...
    编程 发布于2024-11-07
  • Android - 将 .aab 文件上传到 Play 商店时出错
    Android - 将 .aab 文件上传到 Play 商店时出错
    如果您遇到此错误,请按照以下步骤操作以确保与您的包名称和签名密钥保持一致: 确保 app.json 文件中的包名称与您第一次上传 .aab 文件时使用的包名称匹配。 "android": { "permissions":["CAMERA","READ_EXTERNAL_STORAGE...
    编程 发布于2024-11-07
  • 如何使用 PHP 将 HTML 转换为 PDF
    如何使用 PHP 将 HTML 转换为 PDF
    (适用于 Windows 的指南。不适用于 Mac 或 Linux) (图片来源) 在 PHP 中将 HTML 转换为 PDF 的方法不止一种。您可以使用Dompdf或Mpdf;但是,这两个库的执行方式有所不同。 注意:本文中并未包含所有解决方案。 要使用这两个库,您将需要 Composer。 ...
    编程 发布于2024-11-07
  • C++ 会拥抱垃圾收集吗?
    C++ 会拥抱垃圾收集吗?
    C 中的垃圾收集:实现和共识的问题虽然有人建议 C 最终会包含垃圾收集器,但它仍然是争论和持续发展的主题。要理解其中的原因,我们必须深入研究迄今为止阻碍其纳入的挑战和考虑因素。实现复杂性向 C 添加隐式垃圾收集是一个非-琐碎的任务。该语言的低级性质和对指针的广泛支持带来了重大的技术障碍。实施问题的范...
    编程 发布于2024-11-07
  • 如何有条件地删除 MySQL 中的列?
    如何有条件地删除 MySQL 中的列?
    使用 MySQL ALTER 进行条件列删除MySQL 中的 ALTER 命令提供了一种从表中删除列的简单方法。但是,当指定列不存在时,其传统语法 (ALTER TABLE table_name DROP COLUMN column_name) 会引发错误。对于 MySQL 版本 4.0.18,没有...
    编程 发布于2024-11-07
  • 你应该了解的现代 CSS 样式 4
    你应该了解的现代 CSS 样式 4
    TL;DR: 本博客使用代码示例来探索 Web 开发的五种最佳 CSS 样式和功能:容器查询、子网格、伪类、逻辑属性和实验室颜色空间。它们增强响应能力、简化布局并提高设计一致性。 层叠样式表 (CSS) 是一种众所周知的用于设计网页样式的语言。使用 CSS,您可以通过添加空格来自定义 HTML 元素...
    编程 发布于2024-11-07

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

Copyright© 2022 湘ICP备2022001581号-3