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.rhkb.cn/news/247041.html

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

相关文章

万字图解 | 深入揭秘HTTP工作原理

大家好,我是「云舒编程」,今天我们来聊聊计算机网络面试之-(应用层HTTP)工作原理。 文章首发于微信公众号:云舒编程 关注公众号获取: 1、大厂项目分享 2、各种技术原理分享 3、部门内推 前言 想必不少同学在面试过程中&#xff0…

JVM内存问题排查

本文又名《对JVM一窍不通的我快速开始排查应用内存问题》。主要系统性地整理了排查思路,为大家遇到问题时提供全面的排查流程,不至于漏掉某些可能性误入歧途浪费时间。 基本原则 由于本文的定位是Cookbook,基本原则是让整个流程能够系统化规范化的同时将…

【发展】不确定时代下的从容 —— 终局思维、长期主义与复利

文章目录 一、终局思维1、电影 《蝴蝶效应》2、未来是什么样的 二、长期主义1、这是一个不确定的时代2、做难但正确的事情 三、复利1、复利思维2、马太效应 一、终局思维 终局思维 在面对很多选择时,从终点出发考虑问题,来决定当下的选择。 1、电影 《蝴…

机电制造ERP软件有哪些品牌?哪家的机电制造ERP系统比较好

机电制造过程比较复杂,涵盖零配件、采购、图纸设计、工艺派工、生产计划、物料需求计划、委外加工等诸多环节。而供应链涉及供应商的选择、材料采购价格波动分析、材料交货、品质检验等过程,其中某个环节出现问题都可能会影响产品交期和经营效益。 近些…

编译和链接---C语言

引言 众所周知,C语言是一门高级的编程语言,是无法被计算机直接读懂的,C语言也不同于汇编PHP,无法直接翻译成机器语言,在学习的过程中,你是否好奇过我们所敲的C语言代码,是如何一步步翻译成机器…

k8s 容器 java 应用内存限制不生效

一 k8s java 应用内存限制不生效 回顾:Linux杂谈之java命令 容器环境JVM内存配置最佳实践 namespace负责资源隔离 cgroups负责资源限制 容器JVM最佳实践 Metaspace 是 非 Heap 内存 管理空间,那么 Heap 就是操作空间 JVM内存模型简介 隔离:…

web前端---------盒子模型

1.内容 盒子的内容可以包含文字、图片等多种类型。 浏览器在加载网页时&#xff0c;会将元素按照内容区分为替换元素与非替换元素。 &#xff08;1&#xff09;替换元素指的是HTML中的一些形如<img>、<input>等非文本元素。 这些元素本身不包含任何内容&#x…

vue3使用最新的属性defineModel实现父子组件数据响应式绑定

子父之间使用v-model双向绑定数据&#xff0c;子组件每次都要写emit和props觉得麻烦&#xff1f;以前&#xff0c;为了使组件支持与v-model双向绑定&#xff0c;它需要&#xff08;1&#xff09;声明prop&#xff0c;&#xff08;2&#xff09;在打算更新prop时发出相应的updat…

软件设计师——计算机网络(四)

&#x1f4d1;前言 本文主要是【计算机网络】——软件设计师——计算机网络的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

Oracle 19c rac集群管理 -------- 集群启停操作过程

Oracle rac集群启停操作过程 首先查看数据库的集群的db_unique_name SQL> show parameter nameNAME TYPE VALUE ------------------------------------ ----------- --------------------------- cdb_cluster_name …

Java Swing桌面项目打包成可执行jar

前言 最近有需求&#xff0c;将Swing项目打包为一个可执行的jar包&#xff0c;遇见了一些问题&#xff0c;参考AI助手&#xff0c;解决了遇到的问题&#xff0c;也有一些亲身实践体会&#xff0c;记录一下。开发环境IntelliJ IDEA&#xff0c;JDK8&#xff0c;用kotlin语言实现…

C#实现对任意区域任意大小的截图

1&#xff0c;目的: 实现类似系统截图工具那样对屏幕任何区域自定义大小的截图。 2&#xff0c;效果展示&#xff1a; 点击截图 选择需要截图的区域&#xff1a; 区域选择完成后&#xff0c;单击右键完成截图&#xff1a; 在合适的载体上粘贴截图&#xff1a; 3&#xff0c;…

Java基础进阶03-注解和单元测试

目录 一、注解 1.概述 2.作用 3.自定义注解 &#xff08;1&#xff09;格式 &#xff08;2&#xff09;使用 &#xff08;3&#xff09;练习 4.元注解 &#xff08;1&#xff09;概述 &#xff08;2&#xff09;常见元注解 &#xff08;3&#xff09;Target &#x…

C++:auto 关键字 范围for

目录 auto 关键字&#xff1a; 起源&#xff1a; auto的使用细则&#xff1a; auto不能推导的场景&#xff1a; 范围for&#xff1a; 范围for的使用条件&#xff1a; C的空指针&#xff1a; 注意&#xff1a; auto 关键字&#xff1a; 起源&#xff1a; 随着程序越…

【lodash.js】非常好用高性能的 JavaScript 实用工具库,防抖,深克隆,排序等

前言&#xff1a;lodash是一款前端必须要知道的js库&#xff0c;它里面提供了许多常用的功能和实用的工具函数 基本上我参与的项目中都有lodash&#xff0c;只能说lodash太强大了&#xff0c;lodash.js 提供了超过 300 个实用的工具函数&#xff0c;涵盖了很多常见的编程任务 l…

【CentOS】Linux 文件权限与权限修改

目录 1、Linux 中的文件属性 2、如何修改文件属性与权限 3、目录权限与文件权限的区别 4、Linux 中的文件扩展名 用户与用户组是Linux文件权限的重要组成部分。 首先&#xff0c;一定要明确用户与用户组的概念&#xff1a; Linux 一般将文件可读写的身份分为三个类别&#…

Jmeter学习系列之一:Jmeter的详细介绍

目录 一、Jmeter的介绍 二、Jemeter的特点 三、Jemter相关概念 3.1采样器&#xff08;Samplers&#xff09; 3.2逻辑控制器&#xff08;Logic Controllers&#xff09; 3.3监听器&#xff08;Listeners&#xff09; 3.4配置元件&#xff08;Configuration Elements&#…

【K8S】Kubernetes 中滚动发布由浅入深实战

目录 一、Kubernetes中滚动发布的需求背景1.1 滚动发布1.2 滚动发布、蓝绿发布、金丝雀发布的区别 二、Kubernetes中实现滚动发布2.1 定义Kubernetes中的版本2.2 创建 Deployment 资源对象2.2.1 在 Yaml 中定义 Deployment 资源对象2.2.2 执行命令创建 Deployment 资源对象 三、…

关于AOP的@Around特殊处理RequestBody的使用小结

目录 1. 概述 1.1 背景 1.2 源码 2. 测试 2.1 Controller 2.2 SpecialName配置 2.3 RequestConverter 2.4 测试 最近项目上遇到一个这样的需求&#xff1a;用户请求的时候传过来A&#xff0c;在api处理过程中要把A当成B去处理&#xff0c;但是返回的标识中又必须是A作为…

(N-141)基于springboot,vue网上拍卖平台

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plusredi…