x-cmd pkg | go - Google 开发的开源编程语言

目录

    • 简介
    • 首次用户
    • 技术特点
    • 竞品分析
      • 编译型语言
      • 解释型语言
      • Java
      • WebAssebmly
    • 进一步阅读

简介

Go 语言(或 Golang)是 Google 开发的开源编程语言,诞生于 2006 年。其设计目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。语法接近 C 语言,但对于变量的声明有所不同。支持垃圾回收功能。

  1. 原生支持并发:在多核并发上拥有原生的设计优势,无须第三方库、开发者的编程技巧和开发经验。
  2. 代码风格统一:代码的格式化不再是开发者的个人喜好,而是一种强制性的规范。其有统一的一套格式化工具 go fmt,保证了不同开发者编写的代码风格统一。
  3. 语法简洁:语言风格类似于 C 语言,但是去掉了很多 C 语言中很少使用的语法,如继承、重载、泛型、异常、构造函数和操作符重载等。这些语法的去除,使得 Go 语言的语法更加简洁,易于学习和使用。
  4. 自动垃圾回收:开发者不需要关心内存的分配和回收,大大降低了开发者的负担。

首次用户

  1. 使用 x go 即可自动下载并使用

    • 在终端运行 eval "$(curl https://get.x-cmd.com)" 即可完成 x 命令安装, 详情参考 x-cmd 官网
  2. x-cmd 提供1分钟教程,其中包含了 Go 的基本用法,可以帮你快速上手 Go 。

  3. 使用示例:

    go-1min-cn

    # 查看 go 的环境信息
    x go env GOPROXY GOROOT# 查看 go package 的文档
    x go doc fmt.Println# 调整代码格式
    x go fmt ./hello.go# 编译 go 代码生成可执行的二进制文件
    x go build ./hello.go# 编译并运行 go 代码
    x go run ./hello.go
    

技术特点

  1. 强制规范的代码风格
    • 命名大小写有严格的要求,例如,npm package ID,在 Go 内,一率采用严格驼峰风格,统一为 NpmPackageID,而不是 NPMPackgeID 或 NpmPackageID。
    • 代码文件编译前强制以官方指定的统一风格进行格式化:从结尾空行,到行尾去空格等等,不再是个选择,在编译前强制执行。
    • 这些举措虽然有争议,但客观上减少项目团队关于风格统一的争吵(某种程度,Go 语言开发团队扛起了原本由项目管理者所承担的怨念),利于团队聚集,并快速展开合作。
  2. 简单且开箱即用的包管理、代码测试,格式化、构建、运行工具
    • 包管理(go get):可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。
    • 代码测试(go test):用于对 Go 语言编写的程序进行测试。
    • 代码格式化(go fmt):用于格式化 Go 语言的源代码文件。
    • 代码构建(go build): 用于编译指定的源代码文件或代码包及其依赖包。
    • 包运行(go run):用于编译并运行指定的源代码文件或代码包。
  3. 并发机制:以 go routine 为特色的并发机制,非常容易理解,同时也不需要引入额外复杂的开发模式。
  4. 交叉编译自:带的编译器能够轻松交叉编译出能在适合在其它系统和硬件平台运行的二进制执行文件
  5. WebAssembly:Go 是较早在其编译工具链直接提供 WebAssembly 作为编译目标的语言,其高效和编译工具的高效简单使其在 WASM 领域有着一定的竞争优势

由于上述的特点,Go 在最近十年广泛应用于 IO 效率要求较高的网络应用、云计算和分布式网络相关的工具和项目。

竞品分析

编译型语言

Rust,Zig,这类新型的编译型开发语言,经常拿来与 Go 进行对比。

  1. 运行效率上,在一些场景 Go 可能会稍逊。
  2. Go 为了保证编译速度,跳过了编译时的部分优化。
  3. Go 自带 GC,不需要用户自行管理内存,来简化编程模型;客观也会因为 GC 而导致在响应时间会有所影响。
  4. 对于高吞吐量,高并发的高负荷的复杂程序,Go 在效率上的差距并不明显;相反因为 Go 的开发模型往往更简单,从而提升了项目的可维护性。
  5. 当然,对于追求极致性能的团队,在需求相对稳定的项目,rust 和 zig 以及 传统的 C/C++ 自然是更佳的选择
  6. 由于 Go 自带 GC,编译出的 WASM 尺寸,相比 Rust 和 C/C++ 更大。

解释型语言

如 Node/Deno/Bun,Python 等,这类语言的优势在于开发效率,但在运行效率上,相比编译型语言,有一定的劣势。

  1. 虽然上述编译语言都引入了语言级别的 异步,但计算效率还是编译型语言的优势。
  2. 虽然非编译型能够快速部署(尤其是在 x-cmd、nvm等工具的加持下),但在没有安装该语言的情况下,语言的安装包压缩包至少在20MB以上。而 Go 的项目二进制压缩包包很少超过15MB。一般网络型的应用都在 5MB左右,甚至更小。
  3. 启动时间,相较非编译型语言,编译型语言 Go 有很大的优势。

Java

  1. 在 Go 问世之前,Java 是很多分布网络项目的开发语言。但 Go 问世后马上因为其在 goroutine 上的优势(高效易用)马上变成一众网络工具的首选。虽然 Java 对异步的支持很早( NIO )也很丰富,最近 JDK 19 的虚拟线程也相当惊艳。
  2. Java 的启动时间是一直是一大诟病,虽然也在优化。另外,最近 Java 也在 GraalVM 方面做更多的编译尝试。
  3. Java 的 垃圾收集器选择更多,开发者可以根据项目特点进行选择和配置。
  4. Java 拥有一个极其庞大和成熟的开发者生态。

WebAssebmly

  1. 最近两年,WebAssembly后端运行时和各种 WASM语言(AssemblyJS)不断问世。最近 来自中国深圳团队的 Moonbit 更是引起了热议。
  2. 利用 WASM,选择一种易于使用的语言,配合一个强大的 WASM 编译器,既有接近编译型的效率,又有解释型语言的灵活和开发效率的优势。
  3. 我们认为,在技术上,WASM 与 Java 字节码,以及 Go 底层抽象机制一样,其唯一的优势是拥有更高工业界共识,并以存在于主流浏览器当中。得益于开放的技术氛围,在足够工程投入前提下,某项技术取得完全压倒的优势可能不大。因此,技术选型的关键是在于,各个方案的取舍以及运行场景的要求。原生二进制部署的确没有 WASM 当前在后台灵活部署的优势,但其效率上的优势,加上后台集群的同构性,可谓是瑕不掩瑜。而 Go 在没有对性能做出明显妥协的前提下,大大的降低编译语言使用(开发,构建,分发)的难度,在以团队开发为主要模式的后台项目领域中,其优势非常稳固。

进一步阅读

  • 官方入门教程:Tutorial: Get started with Go - The Go Programming Language - 通过该文章可以快速上手 Go 语言。
  • 官方仓库 GitHub - golang/go: The Go programming language - Go 的源代码托管在 GitHub,你可以在这里找到最新版本的 Go 和参与社区贡献。
  • 前景 · Go 语言中文文档 - 你也可以通过阅读这篇文章,进一步的了解 Go 语言的前景。

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

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

相关文章

机器学习---无偏估计

1. 如何理解无偏估计 无偏估计:就是我认为所有样本出现的概率⼀样。 假如有N种样本我们认为所有样本出现概率都是 1/N。然后根据这个来计算数学期望。此时的数学期望就是我们平常讲 的平均值。数学期望本质就 是平均值。 2. 无偏估计为何叫做“无偏”&#xff1…

20240128-读书带来的影响

我本身不算是一个特别喜欢读书的人,更多的时候其实是为了读书而读书。在坚持每天读了一小时书之后,我发现自身开始慢慢有些变化。是什么时候突然有了这种感悟呢,是最近每周5小时左右的微信读书以及纸质书籍的阅读,让我体会到了读书…

常见の算法5

位图 一个int类型32字节,可以表示0-31这32个数出没出现过,出现过1没出现0,再扩大一点搞个数组,就可以表示0-1023出没出现过,一个long类型可储存64位 如何把10位组成的数,第四位由1改成零 package class05…

嵌入式linux面试题目总结

Linux系统中常见的面试题目,分享,欢迎大家前来交流学习。 1、嵌入式系统中的CAN通信协议是什么? CAN(Controller Area Network)通信协议是一种广泛应用于嵌入式系统中的串行通信协议。它最初由德国汽车工业联合会开发…

mysql升级5.X到mysql8关键字问题

数据库系统升级,要注意很多东西,5.x版本升级到mysql8,是一次大的版本升级,因此要注意诸多事项. charset更新 关键字 一些在5.x版本没有问题的字段,在mysql8中会触发关键字. 例如: rank,在mys…

VS如何打包环境

以VS2005为例子,做好的软件需要发给客户现场升级,有时候总是因为系统,环境变量不同导致软件不能正常运行打开,这也是程序员非常头疼的问题,今天我们就一起看下打包环境变量. 这样我们的环境变量就打包到setup中了,目标机台安装即可!!!

新概念英语第二册(43)上

【New words and expressions】生词和短语(13) pole n.(地球的)极 flight n. 飞行 explorer n. 探险家 lie …

[Python] numpy - 如何对数组进行降维或者升维

什么是数组升维? 数组升维是指将原本低维数组转换为更高维的数组的操作。在编程中,数组是一种存储多个相同类型数据的连续内存空间。升维操作可以通过添加额外的维度来增加数组的维数。 举个例子,将一个一维数组升维为二维数组可以使用resh…

Java集合-Map接口(key-value)

Map接口的特点:①KV键值对方式存储②Key键唯一,Value允许重复③无序。 Map有四个实现类:1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类 1.HashMap类: 存储结构:哈希表 数组Node[ ] 链表(红黑…

在windows环境下安装hadoop

Hadoop是一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。但这个架构是基于java语言开发的,所以要先进行jdk的安装,如果电脑已经配置过jdk或者是曾经运行成功过java文件,那就可以跳过第一步。 …

想用verilog写一个npu 需要什么学习路线?

要用Verilog编写一个NPU(神经处理单元),你需要经过以下学习路线: 数字电路基础: 学习数字电路的基本概念,包括逻辑门、寄存器、时钟信号、信号传输等。 Verilog编程语言: 学习Verilog HDL&…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一:Jenkins上调整 进入配置: 构建环境: 自行选择超时时间即可~ 2、方案二:代码调整【python】 安装插件:pytest-timeout 选择一:装饰器用法:将单个测试用例标记为超时&…

【随谈】为什么高端开发岗要求研究过源码?如何研究?

今天来聊一个简单的问题:研究源码有什么用? 不知道你是否注意过,如果找薪资3万以上的岗位,往往都要求研究过框架和中间件源码的优先考虑。 我们随便选几个例子: 这里条件虽然写了很多,但是最重要的都是要…

编程笔记 html5cssjs 063 JavaScrip输出

编程笔记 html5&css&js 063 JavaScrip输出 一、JavaScript 输出方式二、弹出警告框来显示数据三、操作 HTML 元素四、写到 HTML 文档五 、写到控制台小结 JavaScript 输出。JavaScript 没有任何打印或者输出的函数。JavaScript输出主要是显示数据,以使我们看…

Hadoop集群部署流程

前置要求 需要3台虚拟机,系统为Centos7,分别host命名为node1,node2,node3,密码均为root请确保这三台虚拟机已经完成了JDK、SSH免密、关闭防火墙、配置主机名映射等前置操作 在3台虚拟机的/etc/hosts文件中&#xff0…

Java Card调试系统

近年来,嵌入式系统发展迅猛,已经广泛的渗透到了人们日常生活的方方面面中。由于市场对嵌入式系统要求越来越细致深入,致使其开发也越来越复杂。市场日益激烈的竞争趋势致使对嵌入式系统开发周期的要求不断提高,这时支撑软件高效开发的嵌入式开发工具特别是调试工具就显得至关重…

【Docker】快速入门手册

目录 1.概述 1.1.安装 1.2.阿里云镜像加速 1.3.运行原理 2.常用操作 2.1.帮助命令 2.2.镜像操作 2.3.容器操作 2.3.1创建、启动 2.3.2.退出、停止 2.3.3.进入交互式界面 2.3.4.守护式容器交互 2.3.5.查看 2.3.6.删除 2.3.7.拷贝 3.容器数据卷 3.1.概述 3.2.使…

网页转文件下载工具

为了更快捷copy博客 做了个 网页转文件下载工具 1.0.1 更新如下: javaphpjava提供页面转换文件的微服务APIphp调用接口,输出文件下载支持网页转md 1.0.2 更新如下: 样式表切换,白天or黑夜,cookie七天保质期 未…

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步:全局安装:npm install -g create-react-app 第二步:切换到想创建项目的目录,使用命令create-react-app hello-react 第三步:进入项目目录,cd hello-react 第四步:启…

Java技术栈 —— Hadoop入门(二)

Java技术栈 —— Hadoop入门(二) 一、用MapReduce对统计单词个数1.1 项目流程1.2 可能遇到的问题1.3 代码勘误1.4 总结 一、用MapReduce对统计单词个数 1.1 项目流程 (1) 上传jar包。 (2) 上传words.txt文件。 (3) 用hadoop执行jar包的代码,…