我的编程空间,编程开发者的网络收藏夹
学习永远不晚

GO不支持循环引用的原因有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

GO不支持循环引用的原因有哪些

这篇文章将为大家详细讲解有关GO不支持循环引用的原因有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

其中一点就是包的循环引用的报错:

package command-line-arguments imports github.com/eddycjy/awesome-project/a imports github.com/eddycjy/awesome-project/b imports github.com/eddycjy/awesome-project/a: import cycle not allowed

一下子就很懵逼了,为什么 Go 不支持包之间的循环引用呢,这就很不解了,难道还影响性能了?

如下图:

GO不支持循环引用的原因有哪些

今天煎鱼将和大家一起了解背后的原因。

1、案例演示

这里我们做一个基本的案例 Demo,便于没接触过的同学建立初步认知。我们的程序分别有 2 个 package

package a 的代码如下:

import ( "github.com/eddycjy/awesome-project/b")func Hello(s string) { b.Print(s)}

package b 的代码如下:

import ( "fmt" "github.com/eddycjy/awesome-project/a")func Hello() { a.Hello("脑子进煎鱼了")}func Print(s string) { fmt.Println(s)}

再在 main.go 的文件中调用 a.Hello("脑子进煎鱼了") 方法。

一运行,就会出现如下错误提示:

package command-line-arguments
 imports github.com/eddycjy/awesome-project/a
 imports github.com/eddycjy/awesome-project/b
 imports github.com/eddycjy/awesome-project/a: import cycle not allowed

错误的本质原因是 package a 引用了 package b,而 package b 又引用了 package a,造成了循环引用。

这在 Go 语言中是明令禁止的,在编译时就会中断程序,导致编译失败。

2、原因分析

根据现在 Go 官方的统一意见来看,package 循环导入几乎不可能出现,即使是 Go2,也被明确拒绝了。

因为 Go2 可能是很多核心问题的破变的关键节点,有许多人提了类似《proposal: Go 2: allow import cycle》的提案,希望解决循环引入的问题。

Go 语言之父 Rob Pike 亲自回答了这个问题,原因如下:

没有支持循环引用:目的是迫使 Go 程序员更多地考虑程序的依赖关系。

  • 保持依赖关系图的简洁。

  • 快速的程序构建。

如果支持循环引用:很容易会造成懒惰、不良的依赖性管理和缓慢的构建。这是设计者不希望看见的。

  • 混乱的依赖关系。

  • 缓慢的程序构建

因此考虑一开始就保持依赖图的正确 DAGRob Pike 认为这是一个值得预先简化的领域。

在 Go 程序中去做导入循环这件事可能很方便,但背后的代价可能是灾难性的,会对 Go 的构建性能和依赖关系造成非常不利的影响。

所以在 Go 中被明确禁止支持。

关于“GO不支持循环引用的原因有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

GO不支持循环引用的原因有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GO不支持循环引用的原因有哪些

这篇文章将为大家详细讲解有关GO不支持循环引用的原因有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。其中一点就是包的循环引用的报错:package command-line-arguments imp
2023-06-25

win11登录界面死循环的原因有哪些

Windows 11登录界面出现死循环的原因可能有以下几种:1. 更新问题:Windows 11可能在更新过程中出现错误,导致登录界面无法正常加载。2. 软件冲突:某些第三方软件或驱动程序可能与Windows 11不兼容,导致登录界面无法加
2023-09-06

Win10显示器输入不支援的原因有哪些

Win10显示器输入不支援的原因可能有以下几点:显示器的分辨率不被Windows 10支持:某些较旧的显示器可能无法支持Windows 10的最新分辨率。在这种情况下,您可能需要更新显示器驱动程序或更换显示器。显示器连接线路故障:显示器的输
2023-10-20

java中ThreadLocalMap使用弱引用的原因有哪些

小编给大家分享一下java中ThreadLocalMap使用弱引用的原因有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端
2023-06-14

php css不起作用的原因有哪些

这篇文章主要介绍“php css不起作用的原因有哪些”,在日常操作中,相信很多人在php css不起作用的原因有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php css不起作用的原因有哪些”的疑惑有所
2023-07-05

新站总是不被搜索引擎收录的原因有哪些

小编给大家分享一下新站总是不被搜索引擎收录的原因有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用了被惩罚过的域名许多人为了贪图方便省时间就很喜欢用老域名,当然我们也知道的是老域名在网站排名当中也是占有一定的优势,如
2023-06-09

MySQL删除用户不成功的原因有哪些

MySQL删除用户不成功的原因可能有以下几种:用户权限不足:只有具有相应权限的用户才能删除其他用户。用户不存在:尝试删除一个不存在的用户会导致删除失败。用户正在被使用:如果要删除的用户还有相关的数据库对象或正在被其他进程使用,则无法删除。语
MySQL删除用户不成功的原因有哪些
2024-04-09

服务器租用费用不同的原因有哪些

服务器性能不同:不同的服务器配置和性能会影响租用费用。高性能的服务器通常会有更高的租用费用,因为它们能够支持更多的流量和处理更多的数据。服务器位置不同:服务器的位置也会影响租用费用。在一些地区,服务器租用费用可能较低,而在一些繁忙的区域,租
服务器租用费用不同的原因有哪些
2024-04-29

SUSE系统支持的云原生应用开发平台有哪些

SUSE系统支持的云原生应用开发平台主要包括以下几个:Kubernetes:作为一种开源的容器编排平台,Kubernetes可以帮助开发人员更轻松地管理和部署容器化应用程序。Docker:流行的容器化平台,Docker可以帮助开发人员打包、
SUSE系统支持的云原生应用开发平台有哪些
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录