Go语言的一些使用心得
序
起初一直使用的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系列之理解K8s Service的几种模式
欢迎您关注程序员同行者订阅号,程序员同行者是一个技术分享平台,主要是运维自动化开发:linux、python、django、saltstack、redis、golang、docker、kubernetes、vue等经验分享及经验交流。
趁现在,关注我们
牛人并不可怕,可怕的是牛人比我们还努力!
如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!
Go语言的一些使用心得的更多相关文章
- 软件工程线上课程(C语言实践篇)学习心得总结
林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...
- 学习R语言的一点小心得
1.目前R 语言处于入门阶段吧,能够执行一些简单的模型了,还是有收获的. 但是在跑模型的时候经常遇到各种各样的错误,最常见的错误就是数据带入模型之后,数据的类型不对,因此模型跑不下去,因此说,利用he ...
- go语言fallthrough的用法心得
fallthrough:Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面 ...
- Go外包 Go语言外包 Golang外包商 浅谈Go的全局变量和生命周期
最近做Go语言开发,有些心得分享下: Go语言全局var不同于PHP里的全局var,最大区别session 还是app,app 所有人都可以改.session自己改.不同过程之间通用 比如我php ...
- 20165336 学习基础与C语言基础调查
20165336 技能学习心得与c语言学习 一.心得体会 做教练 从老师的健身教练健身学员的学习关系中我懂得了学生应该有自主的学习意识,要有计划地去训练.去流汗,并且要以100分的要求严于律己,老师是 ...
- 20165306学习基础和C语言基础调查
20165306学习基础和C语言基础调查 技能学习心得 我认为兴趣.责任感.毅力对技能的获得非常重要. 因为我从小五音不全.肢体不协调,所以看春晚等节目的时候会把更多的关注点放在主持人身上.小时候觉得 ...
- 20165303学习基础和C语言基础调查
20165303学习基础和C语言基础调查 技能学习心得 我认为我的乒乓球打的还不错,不能说非常好,但是基本的一些技巧都还是会的,小时候爸爸就非常爱看乒乓球比赛,有时候也带着我一起看,最开始看的时候我发 ...
- 20165101 学习基础和C语言基础调查
学习基础和C语言基础调查 技能学习心得 看了15级学长学姐丰富的技能之后,我感到很惭愧.我的课外技能可以说是很糟糕.唱歌的话,小时候还可以用假声唱一下,变声之后就是高音上不去,低音下不来.体育更是差劲 ...
- 1、jeecg 笔记开篇
1. 前言 终究还是入了 jeecg 的 "坑",国庆后公司采用该框架开发,故开篇记录. 虽说入"坑",但不得不承认 jeecg 确实是一个非常强大的平台. 其 ...
随机推荐
- PostGIS导出SHP中文乱码
设置系统的环境变量 PGCLIENTENCODING=GBK,退出PostgreSQL重新登錄,执行成功!
- Linux进程和端口互相查看方法
一.查找应用进程的端口 ps -ef |grep mysql 查看进程 ps:将某个进程显示出来 -A 显示所有程序. -e 此参数的效果和指定"A"参数相同. -f 显示UID ...
- Angular6 用户自定义标签开发
参考地址:https://www.jianshu.com/p/55e503fd8307
- sqlzoo:using group by and having
For each continent show the number of countries: SELECT continent, COUNT(name) FROM world GROUP BY c ...
- jQuery(三)
jquery链式调用 jquery对象的方法会在执行完后返回这个jquery对象,所有jquery对象的方法可以连起来写: $('#div1') // id为div1的元素 .children('ul ...
- python爬取网页内容demo
#html文本提取 from bs4 import BeautifulSoup html_sample = '\ <html> \ <body> \ <h1 id = & ...
- Unity-批量修改Prefab上的属性
问题描述:今天发现工程中有些prefab上的脚本丢失了一些引用,本以为手动拖拽上去搞定,后来查看其它prefab,也有类似的问题,于是写了一个小工具,批量修改下. 上代码: [ExecuteInEdi ...
- Docker容器跨主机通信
默认情况下Docker容器需要跨主机通信两个主机节点都需要在同一个网段下,这时只要两个Docker容器的宿主机能相互通信并且该容器使用net网络模式,改实现方式为网桥模式通信: 除此之外我们还可以通过 ...
- session源码剖析
session机制采用的是一种在客户端与服务端之间保持状态的解决方案,由于采用服务器端保持状态的方案在客户端也要保存标识,session机制也要借助于cookie机制达到目的.session保存了客户 ...
- 【转载】.NET压缩/解压文件/夹组件
转自:http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html 阅读目录 1.前言 2.关于压缩格式和算法的基础 3.几种常见的.N ...