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,多数据库管理平台(私有云)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

215. 数组中的第K个最大元素

题目&#xff1a; 解法一、优先级队列 代码 #include<queue> class Solution { public:int findKthLargest(vector<int>& nums, int k){//使用优先级队列直接秒杀&#xff01;priority_queue<int ,vector<int>,less<int>> q;for(int i0;i&…

HttpClient

HttpClient作用&#xff1a; 发送HTTP请求 接收响应数据 HttpClient应用场景&#xff1a; 使用扫描支付、查看地图、获取验证码、查看天气等功能,需要发起请求的时候 实现HttpClient HttpClient的maven坐标&#xff1a; <dependency><groupId>org.apache.httpco…

链表数组插入排序

InsertSort 插入排序算法&#xff0c;比如打扑克牌的算法时&#xff0c;按照从左到右&#xff0c;找到对应的位置插入排序 最重要的是位置移动 找到对应位置值 #include "iostream" #include "bits/stdc.h"using namespace std;void sort(vector<in…

关于微信公众号授权的几件事

背景 项目需要使用微信公众号发消息&#xff0c;然后就来接入这个微信授权啦&#xff0c;微信公众号发消息前提是还需要用户先关注公众号~ 微信授权是有点恶心的&#xff0c;真的真的需要先配置好环境&#xff0c;开发的话目前是可以使用测试号申请公众号使用测试号的appid~ …

【云备份】业务处理

文章目录 1. 业务处理作用功能 2. 代码框架编写构造函数UpLoad ——文件上传请求ListShow —— 展示页面请求处理实现Download —— 下载请求的处理实现断点续传实现 1. 业务处理 作用 业务处理模块是对客户端的业务请求进行处理 功能 1.文件上传请求&#xff1a;备份客户端…

lv11 嵌入式开发 中断处理 15

前言&#xff1a;中断属于7种异常的1种&#xff0c;这节主要讲CPU接收到中断之后怎么处理&#xff0c;回顾之前的知识。 目录 1 异常 1.1 概念 1.2 异常处理机制 1.3 ARM异常源 1.4 异常模式 1.5 ARM异常响应 1.6 异常向量表 1.7 异常返回 ​编辑 1.8 IRQ异常举例 …

git 中的stash和alias的应用

1.Stash的应用 暂存当前修改&#xff1a; git stash save "message"&#xff1a;将当前修改保存到一个新的 stash 中&#xff0c;并可以为这个 stash 添加一条描述信息。 查看已保存的 stash 列表&#xff1a; git stash list&#xff1a;列出所有已保存的 stash…

scrapyd及gerapy的使用及docker-compse部署

一、scrapyd的介绍 scrapyd是一个用于部署和运行scrapy爬虫的程序&#xff0c;它允许你通过JSON API(也即是web api)来部署爬虫项目和控制爬虫运行&#xff0c;scrapyd是一个守护进程&#xff0c;监听爬虫的运行和请求&#xff0c;然后启动进程来执行它们 scrapyd的安装 scr…

从“芯”到云,看亚马逊云科技如何让未来“平等”发生

文章目录 业界最全面算力选择&#xff0c;有效解决多样性需求多年自研芯片积累&#xff0c;带来性能与性价比双重优势全球基础设施与独特的业务模式&#xff0c;让创新不受限 “科幻作家威廉吉布森说‘未来已至&#xff0c;只是还没有均匀分布’。”2023年6月底&#xff0c;当亚…

5个被忽视的Linux实用命令

大家好&#xff0c;提到Linux&#xff0c;一些用户会认为这是一个复杂的操作系统&#xff0c;因为所有工作都是通过终端使用命令来完成的。但是当用户开始在Linux上工作时&#xff0c;就会喜欢上这些命令&#xff0c;在Linux上工作一段时间后&#xff0c;用户会开始更喜欢Linux…

抖音短视频账号矩阵系统开发新规则

一、抖音官方平台开发新规&#xff1a; 1.代发布管理应用api接口无法在做新的应用申请 仅针对企事业单位开放&#xff0c;目前要想开发新的抖音矩阵系统&#xff0c;就需要在原有的技术算法上进行新一步的调整。 能力介绍 网站应用开发者可以申请开通【代替用户发布内容到抖…

【限时免费】20天拿下华为OD笔试【DFS/BFS】2023B-Linux发行版的数量【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述说明示例一输入输出说明 解题思路代码解法一&#xff1a;BFS解法二&#xff1a;DFS时空复杂度 题目描述与示例 题目描述 Linux 操作系统有多个发行版&#xff0c;distrowatch.com 提供了各个发行版的资料。这些发行版互相存在…

Unity Meta Quest 一体机开发(八):【手势追踪】实现 Hand Grab 扔物体功能

文章目录 &#x1f4d5;教程说明&#x1f4d5;设置刚体和碰撞体&#x1f4d5;给物体添加 Physics Grabbable 脚本&#x1f4d5;给手部添加 Hand Velocity Calculator 物体 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Seed XR 社区。这是一个高…

【实战教程】PHP如何轻松对接腾讯云COS,实现文件上传下载?

腾讯云提供了一系列丰富的云服务&#xff0c;其中包括对象存储&#xff08;Cloud Object Storage&#xff0c;简称COS&#xff09;&#xff0c;它是一种高可靠性、可扩展性强的云存储服务。本文将介绍如何使用PHP对接腾讯云COS存储服务&#xff0c;实现文件的上传和下载功能。 …

【Unity入门】声音组件AudioSource简介及实现声音的近大远小

AudioSource组件 将需要播放声音的物体挂载Audio Listener组件&#xff0c;实现声音的播放 AudioSource组件属性 &#xff08;1&#xff09;AudioClip&#xff08;音频剪辑&#xff09;&#xff1a;指定播放的音频文件。 &#xff08;2&#xff09;Output&#xff08;音频输…

hbase Master is initializing

问题如下&#xff1a; ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializingat org.apache.hadoop.hbase.master.HMaster.checkInitialized(HMaster.java:2452)at org.…

(CS61A)Homework 1: Variables Functions, Control

刚开始的写CS61A作业&#xff1a; OK程序都不知道在哪&#xff0c;自己开个源文件写&#xff08;后来才发现要在网站作业下载&#xff09; Q2: A Plus Abs B Fill in the blanks in the following function for adding a to the absolute value of b, without calling abs. …

栈实现队列,力扣

题目地址&#xff1a; 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;简单 今天刷栈实现队列&#xff0c;大家有兴趣可以点上看看题目要求&#xff0c;试着做一下。 题目&#xff1a; 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支…

一篇带你串通数据结构

文章目录 导论数据结构的定义数据结构在计算机科学中的重要性为什么学习数据结构很重要 1、基本概念1.1、数据、数据元素和数据项的概念1.2、数据对象与数据结构的关系1.3、逻辑结构与物理结构 2、线性结构2.1、数组2.2、链表2.3、栈2.4、队列 3、非线性结构3.1、树3.2、图 4、…

prometheus|云原生|kubernetes内部安装prometheus

架构说明&#xff1a; prometheus是云原生系统内的事实上的监控标准&#xff0c;而kubernetes集群内部自然还是需要就地取材的部署prometheus服务了 那么&#xff0c;prometheus-server部署的方式其实是非常多的&#xff0c;比如&#xff0c;kubesphere集成方式&#xff0c;h…