【程序人生】毕业入职后,C++转Go语言工作半年感受

码农印象 等级 1198 2 0
标签: go语言Golang

【程序人生】毕业入职后,C++转Go语言工作半年感受 我在大学期间就听说了Go并学习了一段时间,坦白的说,那时候对Go是比较无感的,因为并

没有看到Go特别亮眼的地方,可能和我使用C、C++、Java有关,这三种语言可以写高性能、高

并发、高可用的服务;包含了面向过程、面向并发、面向对象的思想,我觉得我并不需要再学习

Go,何况那个时候好像也没宣传的那么优秀。

一切都发生在毕业后,因为工作的需要,我开始写Go了,本来预期是一段压抑、蛋疼的

旅程(被迫使用其它语言的同学可能都会有此感受),结果收获了非一般的惊喜、非一般的效率、

非一般的开发体验。

先用几个词来总结一下我的感受:简洁、标准、组合、创造力、生产力!

特别是生产力,由于Go优秀的标准库、完美的代码安全、全面的三方库、完善的测试机

制、完善的标准管理工具,使用Go给我们小组带来了极大的生产力。

总之,在使用过的语言中,除了C++外,我还没在其它语言上感受过如此之高的生产

力(可能笔者的见识比较狭隘,请轻喷 )。 最近思考了很多,也横向对比了一些,Go

具有高生产力的原因如下:

1.不一定需要IDE

我主要使用的开发工具一个是liteIDE,另外一个就是Vim,特别是在自己实验一些好

的想法时,Vim用的更多。Go开发时的简洁和对其它第三方组件无依赖性,决定了Go可以在任

何地方写,任何地方运行。曾经我尝试过用Vim去写Java,结果无奈的放弃了这个想法。对于很

多环境下来说,不依赖IDE是很重要的。

2.极快的编译构建速度

以前编译C++,Erlang程序,离开座位去喝杯茶,吹吹牛是很正常的事。但是自从用

了Go,这种闲逛行为貌似变得更像是在打酱油,因为一个完整的项目最多仅仅需要数秒到数十秒!!

这个对于初接触Go的同学来说,很神奇;这个对于提高程序员和项目组的生产力来说,很重要!

3.极其优秀的标准库

使用Go的标准库也是非常享受的。从标准库的设计就能看得出,创建Go语言的那几位图

灵奖大神,不仅仅有异常深厚的理论储备,还有着非常丰富、非常广泛的生产实践经验,因为Go

语言解决了很多真实系统设计中,常常会遇到的问题。例如,可以非常简单的使用http服务、为

socket设置读写超时、统计服务器信息、单元测试压力测试、多样化的性能测试等等,所有的这些

让写出高可用、高性能的服务简单了数倍!

4.多样化的内置数据结构

Map是我使用非常多的数据结构-大概10-20%的代码都使用了Map。因此作为一个静态

语言,Go把Map内置为标准的数据类型,是非常棒的,大大简化了使用步骤,提升了性能。

Go语言中的动态数组-slice,对于实际使用中也是非常关键的,配合内置函数append

和range,slice的使用灵活度令人难以置信。

通过这些内置数据结构和内置函数,Go程序员在处理各种数据结构时就掌握了既标准

又强大的武器,也是Go语言之所以简洁的原因之一。

5.统一的代码格式规范

不知道大家有没有做过项目总结,根据我多年的经验,项目中有一些最浪费时间的地方,

其中一个地方就是代码格式问题。在各大论坛、各大语言板块都充斥着括号位置、空格、缩进的

讨论,这些讨论在Go语言中都可以打住了。go fmt可以自动帮我们处理好这些问题,让我们的每

个源码文件的代码格式都是统一规范的。在实际应用中,这个特性可以大大提高团队的开发效率:

最简单的,写代码时,你再也不用在=两边,函数参数的后面等地方加上空格了,只要输入

go fmt myProject,一切问题都烟消云散。

6.只有一个的二进制可执行文件

使用过Go语言的同学,应该都知道程序编译后仅仅生成一个可执行的二进制文件,非常

方便,但是我仍然认为我们大大低估了这个语言特性的好处,特别是在项目的后续开发、维护过程

中。现在社会,网络带宽和存储设备都不再昂贵,但是部署、配置、管理、升级各种软件服务的

代价还是较为高昂的。如果大家自己管理过多个系统、集群,就会知道:升级或安装依赖库、JDK等

组件时,总会碰到特别痛苦的时候,几天的加班加点搞定一个问题都有可能!而纯Go写的程序则不

一样,不管项目处于在哪个阶段,我们需要的也仅仅是一个binary文件,对于提高生产力来说,这个

无疑是非常巨大的。

7.完善的标准测试框架

Go的测试框架是非常棒的,和其它语言不同的是:我们仅仅使用Go语言自带的标准化测试

框架,就可以很好实现各种测试功能:单元,黑盒,白盒,压力测试等等。除了标准测试外,还有很

多第三方的优秀测试框架,但是要记住的是:最好只使用一套测试框架,这样能保持项目的完整性和

一致性。就笔者的经验来看,目前的标准测试框架足够用了,如果需要单步断点可以看这里。

8.性能分析

Go语言自带标准的性能分析工具,包括CPU、内存、阻塞操作(http请求,数据库请求,

time.Sleep等)在内的都可以测量,influxdb就是利用这些工具实现了数据库的常量时间访问。

9.那么对于网上常常被喷的那些所谓的Go的‘问题’呢?

1)GC

Go语言从1.3开始,GC的改进就在持续进行中,1.5中,GC改成三色mark and

sweep后,性能得到了极大的提高,在1.6中,对于内存占用很高、对象很多的系统又进行了一

次大优化,可以说,现在的Go程序一般不存在GC问题,除非:分布式缓存、数据库、消息推送

这样海量对象的场景,这时候需要自己做好可复用对象管理、合并部分小对象、将一些小型的struct

结构定义为值类型而不是指针类型、还可以从业务层面和架构层面进行优化设计等等。

不过,虽然说不太需要担心GC问题,但是大家还是最好学习一下Go的GC原理和

内存管理,理解底层原理对于很多时候快速的定位解决问题是大有裨益的。

PS: 2016年7月7日补充,昨天看到一个使用GO作为核心语言的国外大型视频直播

网站分享了关于GC的演变史,直接说结果吧:1.2版本的时候,GC STW时间是2秒左右,到了1.6版本

再结合一些GC参数调优,达到了30-50ms的级别,目前的1.7版本由于将一些STW工作放到了并发去

执行,因此GC时间到了1m级别,整整上千倍的提升,基本上延时已经不是问题了。后续版本将进一步

改进STW问题,同时大大改善GC的吞吐率。

2)泛型

其实刚从其它语言过来时,我或多或少会在写Go代码时用到模版的思想,但是后

面发现,这样会让代码更难维护,因此,写Go代码就要用Go的哲学和思想。

写过C++代码的都知道:抽象是一把双刃剑,过度的抽象就可能存在潜在的问题。

在我看来,Go所具有的OO思想,是简洁的,是纯粹的,是组合的核心思想。

编程现在就是化繁为简,充分利用组合的思想(也是Unix程序设计提倡的思想),可

以让我们的开发模型和项目代码大大简化、返璞归真 。Go的OO思想充分体现了三位大神作者的

编程和设计功底,估计也只有Unix的作者才能写出这么完美的OO实现了!

3)GOPATH

对于新手来说,GOPATH很难理解清楚,我当时刚接触时,也是迷糊了一段时间。

现在则是混合了两种方式,第一种,在默认的GOPATH下的src中存放项目;第二种,自定义一个

临时的GOPATH,然后存放项目。后者的独立性更好,但是全局使用go build ,go test等命令时就

会有问题,比如手动导出

GOPATH才行:

mkdir sunface 
cd sunface-bench/
export GOPATH=$PWD
go get -v github.com/otoolep/bleve-bench
go install github.com/otoolep/bleve-bench/cmd/bench/.
$GOPATH/bin/bench -h

10.Go语言的总结

Go从出身来看更像学院派语言,但是实际上它是彻头彻尾的工程语言,特别是它很适合

我们团队,很适合基础架构、中间件、云计算平台、PasS平台的开发,因为说它是云时代的未来第

一语言,丝毫不为过。

就我这边的项目而言,分布式日志平台、搜索系统、消息推送等项目中,避免了JVM或者

EVM的麻烦,实在是太美好了,所以,如果条件允许,我会完全选择纯Go来设计实现一个系统,也

许这种美妙只有真正深入用过的人才能体会 ;)

【程序人生】毕业入职后,C++转Go语言工作半年感受

收藏
评论区

相关推荐

Golang高阶:Golang1.5到Golang1.12包管理
版权所有,转载请注明:http://www.lenggirl.com/go/gomod.html(https://links.jianshu.com/go?tohttp%3A%2F%2Fwww.lenggirl.com%2Fgo%2Fgomod.html) 1. 前言 Golang 是一门到如今有十年的静态高级语言了,2009年的时
Golang高并发抓取HTML图片
版权所有,转载请注明:http://www.lenggirl.com/language/gopicture.html(https://links.jianshu.com/go?tohttp%3A%2F%2Fwww.lenggirl.com%2Flanguage%2Fgopicture.html) 使用准备 1.安装Golang 2.
godoc 命令和 golang 代码文档管理
介绍 godoc 是 golang 自带的文档查看器,更多的提供部署服务 go doc 和 godoc 在 golang 1.13 被移除了,可以自行安装 golang.org go1.13 godoc(https://links.jianshu.com/go?tohttps%3A%2F%2Fgolang.org%2Fdoc%2Fg
为什么GOPROXY对Golang开发如此重要
为什么GOPROXY对Golang开发如此重要 引言 从Go 1.13开始,Go Module作为Golang中的标准包管理器,在安装时自动启用,并附带一个默认的GOPROXY。 但是对于其他的GOPROXY选项,比如JFrog GoCenter,以及你自己的Go Module包,你需要在公众视野中保持安全,你应该选择什么样的配置? 你怎样才能
【Golang】GoWeb框架之Gin-简明教程
Gin 简介 Gin is a HTTP web framework written in Go (Golang). It features a
深入理解 Go Slice
(https://imghelloworld.osscnbeijing.aliyuncs.com/0ce8a8773a658d4b843e5796a0dbf001.png) image 原文地址:深入理解 Go Slice(https://github.com/EDDYCJY/blog/blob/master/golang/pkg/20
go run main.go undefined? golang main包那点事
最近把我的ss项目做了一下结构调整,一顿重构后,输入go run main.go,编译报错function undefined。额,怎么回事明明把函数定义在main.go上面的文件中啊。之前也遇到过这个问题不过没用深究,下面我们来说说go main包那点事。golang main包推荐只有一个main.go文件,这样大家就能按照习惯的方式,`go run m
Go 语言编程 — go mod 依赖包管理
目录 == ### 文章目录 * 目录 * go mod 依赖包管理 * 使用 go mod go mod 依赖包管理 ============ go mod 是 Golang 1.11 版本引入的依赖包管理工具。其中,Golang 对 Modules 的定义:Modules 是相关 Go Packages 的集合,是源代码交换和版本控制
Go语言基础之并发
转载自[https://www.liwenzhou.com/posts/Go/14\_concurrence/](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.liwenzhou.com%2Fposts%2FGo%2F14_concurrence%2F) Go语言基础之并发 ==
go系列(3)
这篇讲讲如何在beego框架使用redis。 golang中比较好用的第三方开源redisclient有: * go-redis * 源码地址:[https://github.com/go-redis/redis](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgith
go语言入门【基本类型和语法 一】
GOLANG ------ 入门,废话不说,要知道它是什么,自己百度谷歌就OK的啦 首先,安装环境 ------- 本人的测试环境是centos7 下载编译后版本加入到环境变量即可 GO有个坑的地方是对gopath的设置,类似于JAVA的CLASS\_PATH,但是针对每个项目得重新设置 编译工具 ---- 本人用的编译器是IDEA,对头,就是JA
vs code 下安装golang支持
1)安装gocode go get -u -v github.com/nsf/gocode 2)安装godef go get -u -v github.com/rogpeppe/godef 3)安装golint go get -u -v github.com/golang/lint/golint 4)安装go-find-references g
ubuntu18.04 安装go语言开发环境
### 一、安装golang 首先查看系统上有没有go的版本 ![在这里插入图片描述](https://img-blog.csdnimg.cn/202009130910377.png#pic_center) 若没有go的版本,通过系统包安装 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913091
Archlinux下Visual Studio Code配置Golang开发环境
一、Golang的安装 ----------- GoLang安装并验证一下: [cox@localhost ~]$ sudo pacman -S go [cox@localhost ~]$ go version go version go1.8.3 linux/amd64s 要注意,Golang的安装要确保两个环境变量,一个是G
Golang 开发环境搭建
Golang 是 Google 发布的开发语言,Go 编译的程序速度可以媲美 C/C++。 安装 -- sudo apt-get install golang sudo apt-get install golang-go.tools 使用 -- * 编译运行程序 go run main.go * 查看命令文