Go语言的一些使用心得

强颜欢笑 提交于 2020-02-08 04:22:02

起初一直使用的Python,到了18年下半年由于业务需求而接触了Golang,从开始学习到现在的快半年里,也用Golang写了些代码,公司产品和业余写的都有,今天就写点Golang相关的总结或者感想吧。

PS:运维人员学习一两门开发语言是很重要切明智的,不会开发的运维我认为会逐渐被淘汰的,转型是迟早的事情。

语法简单

GO是崇尚极简主义的,提倡少即是多,GO的特性很少,内部关键字也不多,基础的话一天就可以学完,同时它的语法极为简单,很容易看懂。

部署方便

GO是一个强类型静态语言(最初不习惯),直接把代码编程成可执行文件,不依赖系统环境,完全可以做到轻松的发布。而且还可以交叉编译。这点我很喜欢。

标准库

GO自身带的标准库现在已经很全面的了,目前从文件归档、压缩、数据库到数据序列化,字符格式化、校验、网络、同步、系统、加密、编码、图形等各个方面应有尽有。在标准库上可以完成几乎大部分的需求。重要的是,这些标准库的质量都非常高,都很健壮。接口也较为简单,有清晰的文档说明。同时随着这两年的发展,GO的第三方库也多了起来,虽然可能没有像python那么多,但是较其发展时间来说,还是非常不错的。

集成测试框架

写单元测试不是个容易的工作。需要一些技巧和努力才可以做起来。但是在GO中集成了单元测试框架,只要源码文件以_test.go结尾,就可以直接通过go test执行单元测试。同时还提供了代码测试覆盖率工具,可以很容易实施自动化测试。除此之外,还集成了基准测试框架功能,可以很容易的测量自己写的函数的运行效率。另外,还有性能剖析器,可以在运行时,测试时剖析程序的瓶颈点,进而可以进行优化。有时测试代码写起来比业务代码还要多,但在大型项目中测试是必备的。

代码风格

GO的代码风格要求一致、简洁 。一些对于其他语言的编译器完全忽视的问题,在GO编译器前就会被认为是编译错误,GO语言很可能是第一个将代码风格强制统一的语言。我觉得这点很好,别人写的代码感觉也是自己写的一样。毫无疑问GO语言的这种做法简化了问题。

包管理

GO的源代码建立在package基础之上,注意的是GO中是不支持循环导入包的,还有Golang的包管理是一直是为人诟病之处,从golang1.5引入的vendor机制,到准官方工具dep,目前为止还没一个简便的解决方案。不过现在go modules随着golang1.11的发布而和我们见面了,这是官方提倡的新的包管理,乃至项目管理机制,可以不再需要GOPATH的存在。

垃圾回收

通常C++通过指针引用计数来回收对象,但是这不能处理循环引用。为了避免引用计数的缺陷,后来出现了标记清除,分代等垃圾回收算法。GO的垃圾回收官方形容为 非分代 非紧缩 写屏障 并发标记清理。标记清理算法的字面解释,就是将可达的内存块进行标记mark,最后没有标记的不可达内存块将进行清理sweep。

接口与结构体

第一次学习interface的时候,我是不习惯的,后来就用顺手了。 interface是一种类型,也是很多方法的集合,interface可以通过组合扩展为新的interface,struct也可以通过组合扩展为新的struct。没有python那样的继承,只有组合。这就是GO语言的继承和多态。

工作布局

GO定义了项目的目录结构,比如bin目录,pkg目录以及src目录。这个和我日常的项目布局是一致的。项目结构的一标准性,可以很方便的理解别人的代码框架结构。

并发

现在不管谁提到GO都不得不提到goroutine和channel,GO 语言的并发通过 goroutine 特性完成。goroutine 类似于线程,但是可以根据需要创建多个 goroutine 并发工作。goroutine 是由 GO 语言的运行时调度完成(语言层面实现),而线程是由操作系统调度完成。却不失性能。
GO语言还提供 channel 在多个 goroutine 间进行通信。goroutine和 channel 是 GO语言秉承的 CSP(Communicating Sequential Process)并发模式的重要实现基础。

GO标准库中还提供了sync包,其中有基本的mutex说,还有RMutex这样的读写锁,还有Once,WaiterGroup等东西。基本满足日常中对锁的需求了。并发不可滥用,不然会碰到很多问题。

defer

defer是GO的函数延迟调用,使用中用得好会很方便,用的不好会碰到很多坑,我一般用于文件关闭,db连接关闭,一些延迟处理工作。

panic

万恶的panic,碰到这个有时候不好找原因, 而且会影响全局,没有捕获panic异常的话程序就挂了。

泛型

GO的泛型官方说是在2.0推出,现在看来还遥遥无期呀,要么就用interface{}来做运行时泛型,要不就自己实现。

一句话: 等吧。

总结

GO里面其他一些内建的数据结构,比如slice,map等,这些就不讲了。

学习一门语言,不要不看不动,最好是学完就找实战练手。

GO的特性也有很多,我觉得一下子不要全部看的很重要,其中很多都可以在工程中实践,和语言本身没有太大关系。

总结下来,这东西就是一个工程工具,各种好用,但是从设计角度讲各种粗糙,没必要过度高估。它算的上工程实践中的好朋友。在写服务端,分布式,云原生系统时它是把利器,在web方向也很不错。

文章推荐

《Go在谷歌:以软件工程为目的的语言设计》

kubernetes系列之ConfigMap使用方式

Kubernetes系列之Deployment控制器使用

Kubernetes系列之理解K8s Service的几种模式

kubernetes中的Pause容器如何理解?


欢迎您关注程序员同行者订阅号,程序员同行者是一个技术分享平台,主要是运维自动化开发:linux、python、django、saltstack、redis、golang、docker、kubernetes、vue等经验分享及经验交流。


趁现在,关注我们 

image

牛人并不可怕,可怕的是牛人比我们还努力!

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!

image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!