当前位置: 首页 > news >正文

Go 语言真正有什么用处?

在其十几年的发展过程中,Google 的Go 编程语言已经从 alpha 极客的好奇心发展成为世界上一些最重要的云原生软件项目背后经过考验的编程语言。 

为什么Docker、Kubernetes等项目的开发者会选择 Go ?Go 的定义特征是什么?它与其他编程语言有何不同?Go最适合什么类型的项目?在本文中,我们将探讨 Go 的功能集、最佳用例、该语言的遗漏和限制,以及 Go 的未来发展方向。

Go语言小而简单

Go(或通常称为Golang)是由 Google 员工(主要是长期 Unix 大师和 Google 杰出工程师 Rob Pike)创建的,但严格来说它并不是一个“Google 项目”。相反,Go 是一个社区开发的开源项目,由领导层牵头,他们对 Go 应该如何使用以及语言应该发展的方向有强烈的意见。

Go 旨在简单易学、易于使用且易于其他开发人员阅读。Go 没有大量的功能集,尤其是与C++等语言相比。Go 的语法让人想起C,这使得长期的 C 开发人员相对容易学习。也就是说,Go 的许多特性,尤其是它的并发性和函数式编程特性,可以追溯到 Erlang 等语言。

作为一种用于构建和维护各种跨平台企业应用程序的类 C 语言,Go 与 Java 有很多共同点。作为一种快速开发可在任何地方运行的代码的方法,您可以将 Go 和Python进行比较,尽管差异远远大于相似之处。

Go文档将 Go 描述为“一种快速、静态类型、编译语言,感觉就像一种动态类型、解释语言”。即使是大型 Go 程序也能在几秒钟内完成编译。另外,Go 避免了 C 风格包含文件和库的大部分开销。

Go语言优势

  • 走走很方便
  • Go 很快
  • Go 是便携式的
  • Go 是可互操作的
  • Go 得到广泛支持

Go 通过多种方式让开发人员的生活变得轻松。

走走很方便

Go 与 Python 等脚本语言相比,它能够满足许多常见的编程需求。其中一些功能内置于语言本身中,例如用于并发和类线程行为的 goroutine,而 Go 标准库包中提供了其他功能,例如Go 的 http 包。与 Python 一样,Go 提供自动内存管理功能,包括垃圾收集。

与 Python 等脚本语言不同,Go 代码编译为快速运行的本机二进制文件。与 C 或 C++ 不同,Go 的编译速度非常快,足以让使用 Go 感觉更像是使用脚本语言而不是编译语言。此外,Go 构建系统比其他编译语言的构建系统更简单。构建和运行 Go 项目只需几个步骤和很少的记录。​

Go 很快

Go 二进制文件的运行速度比 C 二进制文件慢,但对于大多数应用程序来说,速度差异可以忽略不计。对于绝大多数工作来说,Go 的性能与 C 一样好,并且通常比其他以开发速度着称的语言(例如JavaScript、Python 和Ruby)快得多。

Go 是便携式的

使用 Go 工具链创建的可执行文件可以独立运行,没有默认的外部依赖项。Go工具链适用于多种操作系统和硬件平台,可用于跨平台编译二进制文件。

Go 是可互操作的

Go 在不牺牲对底层系统的访问的情况下提供了上述所有功能。Go 程序可以与外部 C 库对话或进行本机系统调用。例如,在 Docker 中,Go 与低级 Linux 函数、cgroup 和命名空间交互,以发挥容器魔法。

Go 得到广泛支持

Go 工具链可以作为 Linux、MacOS 或 Windows 二进制文件或 Docker 容器免费提供。Go 默认包含在许多流行的 Linux 发行版中,例如 Red Hat Enterprise Linux 和 Fedora,这使得将 Go 源代码部署到这些平台变得更加容易。从 Microsoft 的Visual Studio Code到 ActiveState 的 Komodo IDE ,许多第三方开发环境都对 Go 提供了强大的支持。

Go 语言最适合的地方

  • 云原生开发
  • 分布式网络服务
  • 实用程序和独立工具

没有一种语言适合所有工作,但有些语言比其他语言适合更多的工作。Go 在开发以下应用程序类型方面表现最出色。

云原生开发

Go 的并发性和网络功能以及高度的可移植性使其非常适合构建云原生应用程序。事实上,Go 被用来构建云原生计算的几个基石,包括Docker、Kubernetes和Istio。

分布式网络服务

网络应用程序的生存和消亡取决于并发性,而 Go 的原生并发特性(主要是goroutine 和 通道)非常适合此类工作。因此,许多 Go 项目都是用于网络、分布式功能和云服务:  API、  Web 服务器、  Web 应用程序的最小框架等。

实用程序和独立工具

Go 程序编译为具有最少外部依赖的二进制文件。这使得它们非常适合创建实用程序和其他工具,因为它们启动速度快并且可以轻松打包以进行重新分发。一个例子是 名为 Teleport 的访问服务器(用于 SSH 等)。通过从源代码编译或下载预构建的二进制文件,Teleport 可以快速轻松地部署在服务器上。

Go语言限制

  • Go 省略了许多语言特性
  • Go 二进制文件可能很大
  • Go垃圾收集吞噬资源
  • Go 缺乏构建 GUI 的标准工具包

Go 省略了许多语言特性

Go 的一系列固执己见的功能既引起了赞扬,也引起了批评。Go 的设计偏向于小而易于理解,故意省略了某些功能。结果是其他语言中常见的一些功能在 Go 中根本不可用——这是故意的。

一个长期存在的抱怨是缺乏通用函数,通用函数允许函数接受许多不同类型的变量。多年来,Go 的开发团队一直反对在该语言中添加泛型,因为他们想要一种语法和一组行为来补充 Go 的其余部分。但从 2022 年初发布的 Go 1.18 开始,该语言现在包含泛型语法。我们吸取的教训是,Go 很少添加主要功能,并且只有在经过深思熟虑后才添加,以便更好地保持跨版本的广泛兼容性。

Go 二进制文件可能很大

Go 的另一个潜在缺点是生成的二进制文件的大小。Go 二进制文件默认是静态编译的,这意味着运行时所需的所有内容都包含在二进制映像中。这种方法简化了构建和部署过程,但代价是简单的“Hello,world!” 在 64 位 Windows 上,大小约为 1.5MB。Go 团队一直致力于 在每个后续版本中减小这些二进制文件的大小 。还可以 通过压缩 或 删除 Go 的调试信息来缩小 Go 二进制文件。最后一个选项可能比云或网络服务更适合独立的分布式应用程序,在云或网络服务中,如果服务出现故障,那么拥有调试信息会很有用。

Go垃圾收集吞噬资源

Go 的另一个备受推崇的功能,即自动内存管理,可以被视为一个缺点,因为垃圾收集需要一定量的处理开销。按照设计,Go 不提供手动内存管理,并且 Go 中的垃圾收集因不能很好地处理企业应用程序中出现的内存负载而受到批评。

也就是说,Go 的每个新版本似乎都改进了内存管理功能。例如,Go 1.8 显着缩短了垃圾收集的延迟时间。Go 开发人员确实有能力在 C 扩展中使用手动内存分配,或者通过 第三方手动内存管理库,但大多数 Go 开发人员更喜欢使用本机解决方案来解决这些问题。

Go 缺乏标准的 GUI 工具包

围绕为 Go 应用程序(例如桌面应用程序中的 GUI)构建丰富 GUI 的软件文化仍然分散。

大多数 Go 应用程序都是命令行工具或网络服务。也就是说,各种项目正在努力为 Go 应用程序带来丰富的 GUI。有 GTK 和 GTK3 框架的绑定。另一个项目旨在提供 平台本机 UI,尽管这些依赖于 C 绑定并且不是用纯 Go 编写的。Windows用户可以尝试 walk。但这个领域还没有出现明显的赢家或安全的长期赌注,而且一些项目,例如谷歌试图构建 跨平台 GUI 库的项目,已经半途而废。此外,由于 Go 在设计上是独立于平台的,因此它们中的任何一个都不太可能成为标准包集的一部分。

最后,虽然 Go 可以与本机系统功能对话,但 Go 并不是为开发低级系统组件而设计的,例如内核或设备驱动程序或嵌入式系统。毕竟,Go 运行时和 Go 应用程序的垃圾收集器都依赖于底层操作系统。(对此类工作的尖端语言感兴趣的开发人员可能会考虑 Rust 语言。)

Go语言的未来

Go 的未来发展将更多地转向其开发者群体的需求,Go 的管理者会改变语言以更好地适应这些受众,而不是以顽固的榜样来引领。一个典型的例子是泛型,经过深思熟虑最好的方法后,泛型最终被添加到语言中。

2021 年Go开发者调查 发现,Go 用户总体上对该语言提供的功能感到满意,但也指出了很大的改进空间。Go 用户希望改进的首要领域是依赖管理(Go 中的一个持续挑战)、诊断错误和可靠性,而内存、CPU 使用率、二进制大小和构建时间等问题的排名要低得多。

大多数语言都倾向于一组核心用例。在 Go 出现的十年里,它的利基市场已经成为网络服务,并且它可能会继续扩大其占有率。总的来说,该语言的主要用例是创建 API 或 RPC 服务 (49%),其次是数据处理 (10%)、Web 服务 (10%) 和 CLI 应用程序 (8%)。

Go 语言吸引力日益增长的另一个迹象是,有多少开发者在对其进行评估后选择了它。在考虑使用 Go 进行项目的受访者中,75% 选择了该语言。在那些没有选择 Go 的人中,Rust (25%)、Python (17%) 和 Java (12%) 是首选选择。这些语言中的每一种都已经找到或正在寻找其他利基市场:Rust 用于安全快速的系统编程;用于原型设计、自动化和粘合代码的 Python ;和 Java 用于长期的企业应用程序。

Go 的速度和开发简单性将在多大程度上将其带入其他用例,或者 Go 将深入企业开发,还有待观察。但 Go 作为主要编程语言的未来已经确定——尤其是在云中,Go 的速度和简单性简化了可长期维护的可扩展基础设施的开发。​


作者:Serdar Yegulalp

更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

irds.cn,多数据库管理平台(私有云)。

相关文章:

Go 语言真正有什么用处?

在其十几年的发展过程中,Google 的Go 编程语言已经从 alpha 极客的好奇心发展成为世界上一些最重要的云原生软件项目背后经过考验的编程语言。 为什么Docker、Kubernetes等项目的开发者会选择 Go ?Go 的定义特征是什么?它与其他编程语言有何…...

贪心 55. 跳跃游戏 45.跳跃游戏 II

55. 跳跃游戏 题目: 给定非负数组,初始位置在数组第一格,数组值是可以选择的最大跳跃步数,判断能不能达到数组末尾。 示例 1: * 输入: [2,3,1,1,4] * 输出: true * 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1,…...

为XiunoBBS4.0开启redis缓存且支持密码验证

修改模块文件1 xiunoPHP/cache_redis.class.php: <?phpclass cache_redis {public $conf array();public $link NULL;public $cachepre ;public $errno 0;public $errstr ;public function __construct($conf array()) {if(!extension_loaded(Redis)) {return $thi…...

手把手教你写一个Shell脚本部署你的服务

我们都知道&#xff0c;在开发的过程中&#xff0c;有很多部署自己微服务的方式&#xff0c;其中有各种各样的不同操作&#xff0c;比如使用 docker 打包为镜像的方式&#xff0c;还有基础使用 jar 包的方式进行部署&#xff0c;但是呢&#xff1f;使用 jar 包部署&#xff0c;…...

银行数字化产品方案

在互联网及金融科技公司快速发展的时代背景下&#xff0c;银行客户普遍都意识到了自己在客户体验、客户洞察、产品服务方面受到的来自互联网的挑战 。为了更好地面对各方面的挑战&#xff0c;传统的业务模式必须革新。传统银行都在积极进行数字化转型。同时&#xff0c;也要面对…...

C# datagridview控件 绑定数据库中表中数据的方式-3

1.如下图所示&#xff0c;为数据库中的一张表结构&#xff0c;注意该表中共有11个字段 2.首先在窗体后台代码中拖入一个datagridview控件&#xff0c;并在窗体加载时&#xff0c;给datagridview控件添加列&#xff0c;添加的方式如下所示&#xff1a;请注意&#xff0c;每个列…...

Amazon CodeWhisperer 正式发布可免费供个人使用

文章作者&#xff1a;sunny 亚马逊云科技日前推出了实时 AI 编程助手 Amazon CodeWhisperer&#xff0c;包括个人套餐和专业套餐&#xff0c;所有开发人员均可免费使用个人套餐。Amazon CodeWhisperer 让开发人员能够保持专注、高效&#xff0c;帮助他们快速、安全地编写代码&a…...

el-table根据返回数据回显选择复选框

接口给你返回一个集合&#xff0c;然后如果这个集合里面的status2&#xff0c;就把这一行的复选框给选中 注意&#xff1a; 绑定的ref :row-key"getRowKeys" this.$refs.multiTableInst.toggleRowSelection(this.list[i], true); <el-table :data"list"…...

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 二维数组处理01背包问题 听起来…...

会话 cookie 及隐私的那些事

什么是会话 Cookie? 会话 Cookie 的概念非常简单。 会话 Cookie,也称为临时 Cookie 或内存 Cookie,是网站在浏览会话期间存储在用户计算机或设备上的小数据片段。 它是由网站生成并由您的浏览器存储和使用的多种 Cookie 之一。 常规 Cookie 或“持久”Cookie 是通常在您的…...

前端知识笔记(二十九)———MySQL通配符和正则表达式

一、通配符 1.% 匹配0&#xff0c;1&#xff0c;多个字符&#xff0c;但不匹配NULL 2._ 匹配单个字符 3.[charlist] 匹配字符列中的任何单一字符 4.[^charlist] 或 [!charlist] 匹配不在字符列中的任何单一字符 二、正则表达式 通配符的LIKE替换为REGEXP LIKE 匹配整个列&…...

C#网络编程(System.Net.Sockets命名空间)

目录 一、Socket类 1.示例源码 2.生成效果 二、TcpClient类和TcpListener类 1.示例源码 2.生成效果 三、UdpClient类 1.示例源码 2.生成效果 System.Net.Sockets命名空间主要提供制作Sockets网络应用程序的相关类&#xff0c;其中Socket类、TcpClient类、TcpListener类…...

linux 系统重装 ssh 连接失败

一.错误描述 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 二.解决方案 输入以下指令&#xff1a; ssh-keygen -R XXX&#xff08;ip地址&#xff09; 按照我的例子&#xff08;ip:10.165.7.136&#xff09;&#xff0c;会返回以下信息: 重新尝试连…...

stream流操作List对象,指定属性,取差集、交集

差集 // 差集 (list1 - list2 list1 中不同数据)List<Person> reduce1 list1.stream().filter(a -> !list2.stream().map(b -> b.getAge() "&" b.getName()).collect(Collectors.toList()).contains(a.getAge() "&" a.getName()…...

计算机相关行业在大数据库时代下的潮流和趁势

还记得当初自己为什么选择计算机&#xff1f; 随着数据的爆炸性增长&#xff0c;数据科学和数据分析成为了热门的领域。这些专业涉及处理和分析大规模数据集的技术和方法&#xff0c;以从中提取有价值的信息和洞察。数据科学家和数据分析师在各个行业中的需求不断增加&#xf…...

Mac苹果视频剪辑:Final Cut Pro Mac

Final Cut Pro是一款由Apple公司开发的专业视频非线性编辑软件&#xff0c;是业界著名的视频剪辑软件之一。它最初发布于1999年&#xff0c;是Mac电脑上的一款独占软件。Final Cut Pro具有先进的剪辑工具、丰富的特效和颜色分级、音频处理等功能&#xff0c;使得用户可以轻松地…...

高德Map

使用 官网&#xff1a;JS API 结合Vue使用 npm i amap/amap-jsapi-loader --saveimport AMapLoader from amap/amap-jsapi-loader;marker的属性、事件、方法 https://lbs.amap.com/api/javascript-api-v2/documentation#marker 自定义marker 为创建的 Marker 指定自定义图…...

SSM新闻发布管理系统

SSM毕设分享 序号1&#xff1a;SSM新闻发布管理系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【SSM新闻发布管理系统】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数…...

客户销售目标拆解:数据驱动的方法和策略

写在开头 在当今竞争激烈的商业环境中,企业需要更加精准地制定销售目标以实现业务增长。数据驱动的方法在这一过程中扮演着关键的角色,帮助企业深入了解客户特征、行为和需求。本篇博客将深入探讨销售目标拆解在企业管理中的重要性,并介绍如何利用数据驱动的方法和策略来制…...

“丝路电商”与泛欧在线公共采购平台Peppol

近期上海商务委员会公布《关于在上海市创建“丝路电商”合作先行区的方案》&#xff08;以下简称方案&#xff09;&#xff0c;方案中提出&#xff1a;“全面贯彻落实党的二十大精神&#xff0c;立足新发展阶段&#xff0c;完整、准确、全面贯彻新发展理念&#xff0c;加快构建…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...