💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~
- 专栏导航
- Python面试合集系列:Python面试题合集,剑指大厂
- GO基础学习笔记系列:记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 运维系列:总结好用的命令,高效开发
- 算法与数据结构系列:总结数据结构和算法,不同类型针对性训练,提升编程思维
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
💖The Start💖点点关注,收藏不迷路💖 |
📒文章目录
- 1、影响 Go 语言发展的早期编程语言
- 2、为什么要创造一门编程语言
- 3、设计原则及发展目标
- 5、语言的特性
- 6、语言适用场景
- 7、特性缺失
- 8、总结
1、影响 Go 语言发展的早期编程语言
Go 语言并非孤立存在,它吸收了许多早期编程语言的精华,其中包括 Pascal、Modula 和 Oberon 等语言在声明和包设计方面的影响,以及 Limbo 和 Newsqueak 在并发原理方面的借鉴。这些语言都为 Go 的发展提供了宝贵的经验和灵感。
Go 语言的设计者们致力于在保持类 C 语言的熟悉性的同时简化语法,使其更加简洁和干净。此外,Go 语言还融合了动态语言的一些特性,使得使用 Python 和 Ruby 的开发者能够轻松上手。
2、为什么要创造一门编程语言
Go 语言的诞生源于对当前主流编程语言的不足的认识。C/C++ 虽然性能出众,但编译速度慢;而像 .NET、Java 这样的语言虽然编译速度快,但执行效率较低。在这种背景下,Go 语言的出现填补了这一空白,提供了快速编译、高效执行、易于开发的全新选择。
3、设计原则及发展目标
Go 语言的主要目标在于融合静态类型语言的安全性和高效性与动态语言的简易开发性,力求达到两者间的平衡,使编程体验更具趣味性而非纠结于权衡取舍。Go 是一门类型安全和内存安全的编程语言,虽保留了指针,但不支持指针运算以减少安全隐患。
Go 语言尤其重视对网络通信、并发和并行编程的支持,为此设计了轻量级线程机制 goroutine 以及通道(channel)来进行 goroutine 间的同步与通信。通过 goroutine 和分段栈的增长机制,以及 goroutine 在线程上的多路复用技术,Go 有效地适应了多核与分布式计算环境的需求,弥补了现有部分编程语言在这方面的不足。
Go 语言的另一大特色是其快速的构建速度,编译和链接到机器代码通常只需几百毫秒至几秒钟,远超 C++ 的编译时间,极大地提升了开发效率。这让依赖于 C++ 构建基础设施的谷歌得以从缓慢编译的困境中解脱出来,使得开发流程更为流畅,测试阶段不必消耗过多时间等待构建。
鉴于 C 语言中头文件的依赖管理问题可能导致大型项目编译耗时数小时,Go 语言采用包(package)模型,通过严谨的依赖关系检查机制加速编译过程,提高了可预测性和构建速度。实际上,Go 语言的标准库编译时间通常不超过 20 秒,普通项目编译只需约半秒,其编译速度堪比甚至超过编译 C 或 Fortran,从而消除了编译阶段对开发者的阻碍,即使作为静态语言,也赋予了开发者如同脚本语言和动态语言般的高效开发体验。
Go 语言在执行速度上与 C/C++ 相近,同时在内存管理方面,为了避免开发者手动处理内存泄漏等问题,Go 内置了垃圾回收机制,即便运行本地代码,也采用了一种类似虚拟机的环境实现快速的垃圾回收,采用标记-清除算法实现。
Go 语言还支持运行时反射,使得开发者能够动态地操作程序中的类型信息。通过 go install
命令,安装和管理第三方包变得简单快捷。另外,Go 语言支持调用 C 语言编写的库文件,方便了与现有 C 语言生态的对接,有利于软件的快速迁移和整合。
5、语言的特性
Go 语言从本质上(程序和结构方面)深入贯彻并发编程的理念。尽管 Go 语言没有类(class)和继承(inheritance)的传统面向对象特征,它通过接口(interfaces)实现了面向对象编程中的多态性。Go 的类型系统设计简洁明了,没有层级结构,因此有时被称为一门兼具面向对象和函数式编程特色的混合型语言。
在传统的面向对象编程中,经常通过构建复杂的类型层次结构来表达程序设计,这在一定程度上增加了代码的复杂性和维护成本,与提升编程生产力的原则并不完全吻合。Go 语言则提倡简洁的设计,函数(functions)作为其基本构造单元,不仅功能强大,而且使用方式灵活,后边章节会进一步探讨 Go 语言在函数式编程方面的特性。
Go 语言采用静态类型系统,确保了类型安全,同时编译成本地代码执行,确保了较高的运行效率。作为一种强类型语言,Go 语言禁止隐式类型转换,坚持显式声明和转换的原则。
尽管如此,Go 语言依然吸取了动态语言的部分优点,例如通过 var
关键字实现变量的声明和类型推断,这使得习惯于使用 Python、Ruby、PHP 和 JavaScript 等动态语言的开发者也能感受到一定的亲和力。
Go 语言还支持交叉编译,开发人员可以在Linux环境下编译出Windows平台可执行的应用程序。值得一提的是,Go 语言不仅是第一门完全支持UTF-8编码的编程语言,其源代码文件本身也采用UTF-8编码,真正实现了国际化的编程体验。
6、语言适用场景
Go 语言特别适合开发高性能分布式系统,特别是涉及 Web 服务器、存储集群和其他大型中央服务器场景。其强大的并行处理能力和简洁高效的语法设计,使得在诸如游戏服务端开发这样的领域表现出色,能有效应对大规模并发请求和数据处理任务。
对于复杂事件处理(CEP)技术,Go 语言的并发模型和高性能表现使其成为理想的选择。随着物联网时代的到来,处理海量并发事件的需求愈发突出,Go 语言在这一领域展现出巨大的潜力。
不仅限于特定领域,Go 语言也可用于通用编程目的,如文本处理、前端交互逻辑实现等,甚至可以像脚本语言那样灵活运用。
虽然 Go 语言具有诸多优点,但需要注意的是,由于其采用垃圾回收机制和自动内存管理,对于严格要求实时性的软件开发可能存在局限性。
在实际应用层面,Go 语言已经获得了广泛的认可和采用。例如,谷歌内部很多大型分布式应用程序已采用 Go 开发,包括谷歌地球的部分组件。同时,Chrome 浏览器中集成了 Go 编译器,使得在 Chrome OS 环境中可以直接运行 Go 语言开发的应用。
Go 语言跨平台兼容性良好,可在 Intel 和 ARM 架构的处理器上运行,因此也能支持安卓系统,比如在 Nexus 系列设备上运行 Go 语言开发的应用。
在 Google App Engine 的支持方面,早在 2011 年,Google 发布了首个用于 App Engine 的 Go SDK,这意味着开发者能够使用 Go 语言构建和部署 Web 应用,打破了原先只能使用 Python 或 Java 的限制。截至描述日期,基于 Go 1.4 版本的 App Engine SDK 达到了 1.9.18 的稳定版本,并且当时的 Go 语言稳定版为 Go 1.4.2。随着时间的推移,Go 语言和 Google App Engine 对 Go 的支持已得到了进一步的升级和完善。
7、特性缺失
纠正如下:
许多在大多数面向对象语言中常见的特性,Go 语言并未直接支持,但其设计者根据语言哲学做出了相应的简化和创新。以下是 Go 语言当前不支持的特性及其背后的设计考量:
- 函数重载:为了简化设计,Go 语言不支持函数重载,即不允许在同一作用域内定义同名但参数列表不同的函数。这有助于避免因重载带来的命名冲突和歧义。
- 操作符重载:Go 语言同样不支持操作符重载,即不能自定义操作符的行为。这样做是为了保持代码的简洁性和一致性,避免了因操作符行为多样化带来的阅读困难和潜在错误。
- 继承:Go 语言摒弃了传统的类继承机制,转而采用组合(Composition)的方式来实现代码重用和结构化设计。接口(Interfaces)在 Go 中扮演着重要作用,它提供了面向对象设计中的多态性,但不同于类继承。
- 隐式类型转换:为了避免在 C/C++ 开发中可能出现的类型混淆和潜在 Bug,Go 语言不支持隐式类型转换,所有的类型转换必须显式进行。
- 变体类型:尽管 Go 语言中的接口可以在某种程度上模拟变体类型(Union 或 Variant)的功能,但语言本身并不直接支持变体类型。
- 动态加载代码:Go 语言原生不支持运行时动态加载代码,也就是说,无法在程序运行时插入或替换代码模块。
- 动态链接库:Go 语言倾向于静态链接,默认情况下编译后的二进制文件包含所有依赖,但通过 cgo 可以编译和使用 C 的动态链接库。
- 泛型:直至上述知识截止日期为止,Go 语言不支持泛型编程。然而,Go 语言在其后续版本(如 Go 1.18)中引入了泛型支持。
- 异常处理:Go 语言没有传统的 try-catch 异常处理机制,而是使用 panic() 和 recover() 来处理运行时错误。panic 是一种在遇到不可恢复错误时停止执行的机制,recover 可以捕获并处理 panic。
- 静态变量:Go 语言中的变量默认都是在堆或栈上分配,全局变量是每个包级别的,而非传统意义上静态链接时初始化一次的静态变量。不过,Go 语言的全局变量在生命周期上可以视为静态的,即在整个程序运行期间存在。
Go 语言开发团队对于缺失特性的讨论,可以查看 Go 常见问题。
8、总结
Go 语言通过一系列精心设计的特性,成功解决了现代编程中的多项痛点,成为了一门深受开发者喜爱的高性能、易用性强的编程语言。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏、分享下吧,非常感谢!👍 👍 👍
🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
💖The End💖点点关注,收藏不迷路💖 |