Golang使用感受 - Go语言中文社区

Golang使用感受


之前一段时间,我曾经做过一些有关Golang的介绍。最近从使用Golang的过程中,又有一些新的感受,与大家分享一下。我比较反对语言之间的比较,一门编程语言能做什么,取决于用户用它做了什么,而一门语言擅长于做什么,取决于用户经常用它做什么,它的语法在解决哪个领域的问题比较有优势。我只是单纯站在一门语言的角度,来谈谈自己对它的客观看法。

Golang能做什么?目前我使用Golang做过Web应用,树莓派上的应用,Linux和Windows系统下的应用。总结起来,Golang可以开发主流操作系统下的应用。嵌入式开发我也曾想过,但是目前使用Golang的嵌入式开发库比较少,估计是语言影响力的问题,暂且搁置。Web应用使用了gin,gorm,casbin等开源框架,由于Golang比较适合于做分布式应用,所以这方面的框架都很轻巧好用。树莓派应用换句话说是ARM下的Linux开发,Linux开发就是平时的x86或x64下的应用开发,Windows下的开发也是x86或x64下的开发。Golang的编译器集成了交叉编译,只需要在go build前指定GOOS和GOARCH两个环境变量,就可以编译出不同cpu架构和不同操作系统的应用。当然,前提是你的应用都是采用Golang的包开发的,否则也会有平台移植问题,毕竟Golang是编译型语言,不同操作系统的系统调用和库还是有区别的。

Golang的语法集非常小,概念也少,但是正因为如此,Golang的使用需要比较好的软件开发功底。你需要对面向对象编程有深入理解,需要了解鸭子类型,需要了解面向接口编程的理念等等,才能使用Golang写出好的代码。你需要明白使用C/C++开发时候的各种问题,才能感受到Golang的改进之处,它是如何做到了性能和语言结构的权衡。所以,有人说,Golang不是面向初学者最好的语言,无法做到像Python那样吸引人,我觉得的确如此。

Golang比较被人诟病的是它的error机制,Golang建议,如果一个函数或者方法有返回值(或者有错误分支),那么一定要返回一个error接口的实例,避免C/C++中使用不同返回值数值表示不同含义的问题(0成功,1失败,诸如此类),如果有多个返回值,则error实例应该是最后一个。导致的结果是,代码中到处都是error的判断和返回错误。初用感觉这样确实多了很多所谓的多余代码,但实则不然,这是Golang在语法层面上帮助开发者实现代码的严谨性。如果回头看看我们之前做过的代码,你会发现,不管你当时是否考虑到了问题,大部分补丁,都是针对错误的,而且代码的大部分内容,也是在处理错误分支。正确的分支和错误分支是相对的,我们为了保证正确分支的正确性,必然要对错误分支进行处理,这样才能实现逻辑上的全覆盖。Golang利用编码过程中的冗余和重复,避免了我们将来回头找问题的困难。也就是说,使用Golang,如果你的封装做的足够好,函数的粒度适中,你的error就很难扩散,总是在它出现的第一现场就被检查,你可以继续返回给上层,也可以转换成其他error传递出去,还可以直接拦截处理或者打印。未来排查问题时,你会发现,你定位问题的速度极大提高。

Golang最让我开心的是它编译出来结果就是一个可执行文件,对于部署提供了极大地便捷。我们可以直接把程序放在需要的地方,双击就可以使用;也可以将它配置为系统服务,做一些系统级的处理;还可以封装到docker,利用docker和k8s简单地实现分布式。

Golang的协程和通道使用十分方便,提供的机制非常底层,但是使用起来比较简单。不过,这里的坑也不少,尤其是通道的使用,之前很简单的把通道当做了数据有序传递的管道,但是我这样的理解缺少了一个组件——协程,通道应该是协程间数据有序传递的管道,不在异步的环境下使用管道,不管你的管道是否有缓冲,都是在给程序创造死锁的机会。

Golang也存在一些问题。Golang实现接口的方式很简单,只需要结构实现这个接口的所有方法就可以了,但是带来的一个问题就是我们很难找到我们结构到底实现了哪个接口,不过有一个反作用,当你试图实现一个接口的时候,你发现,你好像已经实现了这个接口,只是你起的方法名不太一样,那么,改改方法名就可以了,也可以对已有方法使用接口的方法名进行封装。Golang的结构如果不传递指针,会进行值拷贝,但是注意,这里是值拷贝,并不是深拷贝,如果结构内包含的字段有slice,map,指针等类型,这些并没有进行深拷贝,我们使用的还是同一块内存的内容。

以上就是我使用了一段时间Golang之后的一些想法,拿来与大家分享一下,不过整体来说,我还是比较喜欢Golang的风格和开发方式,毕竟它也被Google定义为C/C++的替代,而我曾经做C/C++比较多,确实感受到了Golang在这方面的改进,而Golang的开发理念,思想和性能又都有C/C++的影子。这种感觉,我很喜欢。

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yjp19871013/article/details/94819774
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-23 16:42:48
  • 阅读 ( 1490 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢