Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go语言初窥

Go语言初窥

作者头像
sparkle123
发布于 2021-01-26 06:47:56
发布于 2021-01-26 06:47:56
50900
代码可运行
举报
运行总次数:0
代码可运行

资源消耗少

Go与C/C++消耗的CPU差距不大,但由于Go是垃圾回收型语言,耗费的内存会多一些。 拿Go与同为垃圾回收型语言的Java简单比较一下。

Java当年诞生时最大的卖点之一是“一次编写,到处运行”。这个特性在20年前很棒,因为市场上几乎没有虚拟化解决方案。但是到了今天出现了Docker之类一系列跨平台工具,这种卖点可能被看做一种短板,主要原因如下:

  • Java需要启动JVM进程来运行中间代码,程序需要预热
  • 堆内存较大时,垃圾回收器需要进行深入调优,但在一些对实时性要求高的场景下,可能无解,Full GC一触发就是灾难
  • JDK体积庞大, Spring Boot jar包体积大,在微服务架构下问题最突出
  • Spring全家桶越来越重,导致使用全家桶的应用,性能较差

抛去JVM启动和预热时间,运行一个最简单的HTTP程序,与Go对比,Java在CPU上的消耗多约20%,内存上的消耗约高两个数量级。

为并发IO而生

开发过网络库的同学可能都知道Unixepoll调用,如果了解Windows应该听说过IOCP,这两种接口分别对应网络的Reactor和Proactor模式。

简单来说,前者是同步的事件驱动模型,后者是异步IO。不论使用任何语言只要涉及到高性能并发IO都逃不过这两种模式开发的折磨——除了Go

一般来说一个服务进程包含main、日志、网络、其他外部依赖库线程,以及核心的服务处理(计算)线程,其中服务线程可能会按CPU核数配置开启多个。

go创建的goroutine相当于将IO读写和事件触发拼接起来的一个容器,消耗的内存非常小,所有goroutine被Go自动调度到有限个数的线程中,运行中切换基本是使用epoll的事件机制,因此这种协程机制可以很迅速启动成千上万个而不太消耗性能。

工具集统一

Go作为工程语言而设计,即使一个团队有多种风格的开发者,他们的流程和产出最终都需要尽量保持一致,这样协同开发效率才会高。为了保证各方面的统一,Go提供了多种工具,安装以后执行go命令就能直接使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go run:直接运行go代码文件

go build:编译到本目录

go install:编译并安装到统一目录,比build快

go fmt:格式化代码,写完代码一定要记得用

go get:下载并安装包和依赖库

go mod:包管理,1.11版加入

go test:运行单元测试

go doc:将代码注释输出成文档

go tool:实用工具集,包括静态错误检查、测试覆盖率、性能分析、生成汇编等等

运维性好

Go是一种适应分布式系统和云服务的语言,所以它直接将静态编译作为默认选项,也就是说编译之后只要将可执行文件扔到服务器上或者容器里就能没有任何延迟地运行起来,不需要任何外部依赖库。 Go的项目只要在编译时修改参数,就能交叉编译出其他任意支持平台所需的二进制文件。比如在macOS上开发,当需要在linux服务器上测试则使用如下命令编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GOOS=linux GOARCH=amd64 go build ./...
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言入门
在编程语言的江湖中,Go(Golang)的崛起堪称传奇——诞生仅十余年,却已成为云计算、微服务、高并发领域的「事实标准」。从Docker到Kubernetes,从Etcd到TiDB,Go的身影遍布现代基础设施的核心场景。它既非C/C++的性能王者,亦非Python的胶水语言,却以「简单、高效、可维护」的设计哲学,重新定义了「工程级语言」的标准。
小文要打代码
2025/07/10
1120
深度解密Go语言之scheduler
一个月前,《Go 语言高级编程》作者柴树杉老师在 CSDN 上发表了一篇《Go 语言十年而立,Go2 蓄势待发》,视角十分宏大。我们既要低头看路,有时也要抬头看天,这篇文章就属于“抬头”看天类的,推荐阅读。
梦醒人间
2019/09/04
1.1K0
深度解密Go语言之scheduler
字节跳动的 Go 语言面试会问哪些问题?
这个一般分为两个层次,初中级开发(1-1、1-2)和高级开发(2-1、2-2),不同级别的面试一般要求是不一样的。对于初中级开发,一般会问一些语言层面的东西,一些常用的基础原理和一些算法,但是高级开发就没那么简单了。下面我为读者分享一段面试的经历。
肉眼品世界
2020/11/11
3.5K0
Go语言的一些使用心得
起初一直使用的Python,到了18年下半年由于业务需求而接触了Golang,从开始学习到现在的快半年里,也用Golang写了些代码,公司产品和业余写的都有,今天就写点Golang相关的总结或者感想吧。
程序员同行者
2019/04/19
7380
100天精通Golang(基础入门篇)——第1天:学习Go语言基本概念
欢迎来到100天精通Golang的基础入门篇!在这个系列教程中,我们将带领你逐步掌握Go语言的核心概念和语法。本篇博文将着重介绍Go语言的基本概念,包括其定义、用途和优势。通过阅读本文,你将对Go语言有一个清晰的了解。
猫头虎
2024/04/09
9240
100天精通Golang(基础入门篇)——第1天:学习Go语言基本概念
Go语言学习之旅 1 - 简介
语法简单 并发模型 Goroutine 是 Go 最显著的特征。它用类协程的方式来处理并发单元 并发编程变得极为容易,无须处理回调,无须关注线程切换,仅一个关键字,简单而自然。 搭配 channel,将并发单元间的数据耦合拆解开来,这对所有纠结于内存共享、锁粒度的开发人员都是一个可期盼的解脱 内存分配 垃圾回收 静态链接 将运行时、依赖库直接打包到可执行文件内部 标准库 其中值得称道的是 net/http,仅须简单几条语句就能实现一个高性能 Web Server, 工具链
张云飞Vir
2020/03/16
3650
五分钟技术小分享 - 2022Week11
Go的源码会被编译成二进制文件,然后直接在对应的操作系统上运行。那么,这对学习GC有什么意义呢?让我们一起看看今天的内容。
junedayday
2022/03/29
3440
五分钟技术小分享 - 2022Week11
Go语言垃圾回收器的限制优先优化策略
为了解决这个问题,Go语言的垃圾回收器引入了一种叫做限制优先(Limit Prioritization)的优化策略。这种策略的基本思想是:尽量减少垃圾回收对程序运行性能的影响,即在满足程序运行要求的同时,尽可能降低垃圾回收的开销。
运维开发王义杰
2023/08/10
1630
Go语言垃圾回收器的限制优先优化策略
Go语言简介&开发环境配置
Go (又称GoLang)是一款比较年轻的开源编程语言,它是从2007年末由来自谷歌的Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来又加入了后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源。现在Go语言拥有活跃的开发社区和开发人员,国内的一些大公司(字节、快手、B站)也纷纷开始转向基于Go的后端开发。
Steve Wang
2020/12/21
8600
Go语言简介&开发环境配置
[Go语言]采用Go语言作为服务端编程语言的建议书
按:这是我给公司(部门)写的使用推广Go语言的建议书,给领导看了以后,领导同意使用Go语言对一些服务器程序进行改写并部署到外网进行验证。希望这篇文章能够给同样在自己公司内部推广Go语言的技术人员有一些帮助。同时如果发现文章中有疏漏不足错误之处也欢迎提出。 采用Go语言作为服务端编程语言的建议书 一、当前的挑战 随着互联网时代的到来,软件(特别是网络游戏)版本更新产品更迭的速度也在加快,这对软件开发效率和质量提出了更高的要求。只有更快更好更多地拿出产品,软件公司才能在市场上取得一席之地。随着
李海彬
2018/03/22
2.5K0
阿里太狠了,把人问蒙了
在互联网大厂Java后端面试中,阿里巴巴算是里面难度比较高的,面试都对Java 技术特别熟,所以问Java 都会比较深。
小林coding
2024/05/17
2740
阿里太狠了,把人问蒙了
Go 语言的前生今世与介绍
Go 语言的创始人有三位,分别是图灵奖获得者、C 语法联合发明人、Unix 之父肯·汤普森(Ken Thompson),Plan 9 操作系统领导者、UTF-8 编码的最初设计者罗伯·派克(Rob Pike),以及 Java 的 HotSpot 虚拟机和 Chrome 浏览器的 JavaScript V8 引擎的设计者之一罗伯特·格瑞史莫(Robert Griesemer)。
贾维斯Echo
2023/10/18
1.4K0
Go 语言的前生今世与介绍
nodejs php go语言了解
1、Nodejs 1) 简单的说 Node.js 就是运行在服务端的 JavaScript。 2) Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 3) Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。 4) 我们写下的js代码,是在单线程的环境中执行,但nodejs本身不是单线程的。如果我们在代码中调用了nodejs提供的异步api(如IO等),它们可能是通过底层的
李海彬
2018/03/21
1.9K0
Golang与Java全方位对比总结
Golang: 编码风格及可见域规则严格且简单;Java: 来说层次接口清晰、规范,主要表现有以下这些。
腾讯技术工程官方号
2023/07/15
1.3K0
Golang与Java全方位对比总结
Go语言的runtime包深入解析
Go语言的runtime包是Go标准库中非常重要的一部分,它包含了与Go运行时系统(包括内存分配、垃圾回收、并发调度等)相关的底层函数和数据结构。理解runtime包的工作机制,有助于开发者更好地优化Go应用程序的性能。
二一年冬末
2024/07/01
6420
Go语言入门介绍
Go语言是一门由Google设计和开发的编程语言,于2009年首次公开发布。自此以后,Go语言在短时间内就迅速发展壮大,并逐渐成为了一个备受关注的编程语言。
一个风轻云淡
2023/11/23
2660
Java 革新之路:GraalVM 原生镜像
Java 主导着企业级应用。但在云计算领域,采用 Java 的成本比它的一些竞争对手更高。原生编译降低了在云端采用 Java 的成本:用它创建的应用程序启动速度更快,使用的内存更少。
xcbeyond
2022/09/07
1.6K0
Java 革新之路:GraalVM 原生镜像
[GO专栏-2]Go语言的设计哲学
所谓大道至简,就是这个道理,语言终归只是个工具,能用简单的方式处理问题为什么要复杂起来呢?
苏州程序大白
2022/04/13
8210
[GO专栏-2]Go语言的设计哲学
不是语言之争--Go vs Erlang
因为 云巴 系统对高并发、低延迟的需求,我们对各个语言、平台做了很多的调研比较工作。这自然就包括致力于开发高并发应用的 Go 和 Erlang。 并发 Go 对高并发的支持通过 goroutine 实现。goroutine 可以理解为轻量级的 线程(thread)。同一个 Go 应用创建的 goroutine 共享地址空间。 Erlang 的高并发通过轻量级 进程(process)实现,每一个进程都有独立的状态记录。 另外,使用 goroutine 要注意,goroutine 运行完毕后,占用的内存放回内存
李海彬
2018/03/21
3K0
go面试题目收集
使用append向Slice追加元素时, 如果Slice空间不足, 将会触发Slice扩容, 扩容实际上重新一配一块更大的内存, 将原Slice数据拷贝进新Slice, 然后返回新Slice, 扩容后再将数据追加进去。 扩容容量的选择遵循以下规则:
twelvecoder
2021/12/24
7340
go面试题目收集
相关推荐
Go语言入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验