起初一直使用的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等经验分享及经验交流。


趁现在,关注我们 

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

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

Go语言的一些使用心得的更多相关文章

  1. 软件工程线上课程(C语言实践篇)学习心得总结

    林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...

  2. 学习R语言的一点小心得

    1.目前R 语言处于入门阶段吧,能够执行一些简单的模型了,还是有收获的. 但是在跑模型的时候经常遇到各种各样的错误,最常见的错误就是数据带入模型之后,数据的类型不对,因此模型跑不下去,因此说,利用he ...

  3. go语言fallthrough的用法心得

    fallthrough:Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面 ...

  4. Go外包 Go语言外包 Golang外包商 浅谈Go的全局变量和生命周期

    最近做Go语言开发,有些心得分享下: Go语言全局var不同于PHP里的全局var,最大区别session 还是app,app 所有人都可以改.session自己改.不同过程之间通用   比如我php ...

  5. 20165336 学习基础与C语言基础调查

    20165336 技能学习心得与c语言学习 一.心得体会 做教练 从老师的健身教练健身学员的学习关系中我懂得了学生应该有自主的学习意识,要有计划地去训练.去流汗,并且要以100分的要求严于律己,老师是 ...

  6. 20165306学习基础和C语言基础调查

    20165306学习基础和C语言基础调查 技能学习心得 我认为兴趣.责任感.毅力对技能的获得非常重要. 因为我从小五音不全.肢体不协调,所以看春晚等节目的时候会把更多的关注点放在主持人身上.小时候觉得 ...

  7. 20165303学习基础和C语言基础调查

    20165303学习基础和C语言基础调查 技能学习心得 我认为我的乒乓球打的还不错,不能说非常好,但是基本的一些技巧都还是会的,小时候爸爸就非常爱看乒乓球比赛,有时候也带着我一起看,最开始看的时候我发 ...

  8. 20165101 学习基础和C语言基础调查

    学习基础和C语言基础调查 技能学习心得 看了15级学长学姐丰富的技能之后,我感到很惭愧.我的课外技能可以说是很糟糕.唱歌的话,小时候还可以用假声唱一下,变声之后就是高音上不去,低音下不来.体育更是差劲 ...

  9. 1、jeecg 笔记开篇

    1. 前言 终究还是入了 jeecg 的 "坑",国庆后公司采用该框架开发,故开篇记录. 虽说入"坑",但不得不承认 jeecg 确实是一个非常强大的平台. 其 ...

随机推荐

  1. VS2017 提示警告 IDE0006

    MS的错误帮助:https://github.com/dotnet/roslyn/wiki/Diagnosing-Project-System-Build-Errors 看起来好复杂- 其实嘛- 检查 ...

  2. Scrapyd 改进第二步: Web Interface 添加 STOP 和 START 超链接, 一键调用 Scrapyd API

    0.提出问题 Scrapyd 提供的开始和结束项目的API如下,参考 Scrapyd 改进第一步: Web Interface 添加 charset=UTF-8, 避免查看 log 出现中文乱码,准备 ...

  3. UOJ#440. 【NOIP2018】填数游戏 动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ440.html 前言 菜鸡选手到省选了才做联赛题. 题解 首先我们分析一下性质: 1. 假如一个格子是 0,那么它的右上角 ...

  4. JWT 超详细分析

    请参考以下链接 https://learnku.com/articles/17883

  5. 在ASP.NET Core 中怎样使用 EF 框架读取数据库数据

    添加测试数据 我们首先使用 SQLite Studio 添加三条数据 ID Name 1 李白 2 杜甫 3 白居易 使用 SQLite Studio 打开我们的 blogging.db 数据库,双击 ...

  6. iOS 9之后Url链接的NSUTF8StringEncoding转码实现

    在iOS中通过WebView加载Url或者请求HTTP时,若是链接中包含中文.特殊符号&%或是空格等都需要预先进行一下转码才可正常访问. 许久没编码,原先的方法已废弃了都,在此对应当前最新的方 ...

  7. less是什么?直接用css好还是less好

    问:Less是一个动态CSS语言框架,Less扩展了CSS的动态特性 [1]:从实现角度来说,直接用css看起来能方便一些,而less还要编译? [2]:技术上好像灵活,但是从使用者的角度来说,css ...

  8. CodeForces - 777B Game of Credit Cards 贪心

    题目链接: http://codeforces.com/problemset/problem/777/B 题目大意: A, B玩游戏,每人一串数字,数字不大于1000,要求每人从第一位开始报出数字,并 ...

  9. 1.3 正则表达式和python语言-1.3.4使用 match()方法匹配字符串

    1.3.4使用 match()方法匹配字符串(第一次写博客,格式,述语有不当之处还请见谅)2018-05-08 Python 代码是以Jupyter Notebook编写的,主要写的是python3的 ...

  10. 如何给小学生讲清楚ECC椭圆曲线加密

    对于RSA这套公私钥加密的思路,我以为我挺明白的,运用的娴熟自如. 当然现在RSA用的不多,而是基于ECC曲线来做签名验签,最大名鼎鼎的莫过于比特币. 可是前两天和别人讲代码,被问了ECC为什么可以用 ...