服务器后端语言选择(Go篇)00_55

背景图片 来自 Markus Spiske on Unsplash

ProjectX只是现在我在做的一个项目的名称,我计划在整个项目的过程中做更多的尝试,并且尽可能的将过程记录下来。如果感兴趣可以关注我,非常欢迎给我或是ProjectX提提你的建议。

这次ProjectX在选择后端开发语言的时候,我不会考虑我自己的熟悉程度和之前的积累,希望可以比较客观的选择一个适合的后端语言,我也可以通过这个过程了解更多后端语言。目前计划尝试的后端语言有:PHP、JAVA、Node.js、Go、Rust、Ruby、Python。没有案例的分享都是耍流氓,我用这几个语言统一做一个简单的数据查询返回的API接口,来从服务器支持、开发环境搭建、RESTful路径设置、数据库连接、语言结构和文档社区丰富度六个方面来聊聊我自己的感受。

语言简介

Go属于相对比较年轻的一个编程语言,最初在2007年有Google的Robert Griesemer, Rob Pike, Ken Thompson设计,并在2009年11月推出,虽然只有短短的10年多一点的历史,但是最近几年不同的编程语言排行榜,Go都能排进前十。作为Google很多新项目的主编程语言,Go最初设计的时候就是以解决多线程编程和高并发为主要卖点的。作为2007开始设计的编程语言,对于多核系统的支持更原生,和其他在发展过程中才开始支持多线程的语言要更有优势。根据网上的资料和我看了文档的初步理解,Go语言在结构上非常类似C语言,而且语法结构非常简洁,关键词并不多。Go应该属于一个功能比较强大的编程语言。

GoLang Logo

服务器支持

Go的运行环境可以在Windows、macOS和Linux下直接安装,也可以通过编译源码来安装。所以基本上主流的服务器操作系统都能支持运行Go开发的应用程序。只要在对应服务器操作系统下安装好Go的运行环境,就能直接运行通过Go开发的应用程序。对于处理HTTP请求,最简单的可以通过Go的net/http包中的功能通过三行代码就能做到了。当然如果对于HTTP服务器需要更多的功能也可以做的更复杂,或是调用Go现有的HTTP第三方库。只需要对于完成的代码编译,并执行就可以了。对于服务器的支持还是非常好的,而且可以根据项目的特性来定制服务器性能。

IDE VS EDITOR

作为一个高级编程语言,使用IDE也是一个不错的选择,直接完成脚手架的搭建,而且编程环境也不需要花太多时间搭建,可算是直接开箱即用,我尝试了JetBrain的GoLand。下载安装后就可以直接新建项目,不需要安装类似代码格式化或是自动代码补充的工具。对于希望直接上手开发的朋友还是非常值得的,虽然有些小贵,但是节省了很多时间。

而且使用GoLand的时候可以根据输入的代码添加Imports这个功能还是不错的,可以有效的提高代码效率。

重播 播放 00:00 / 00:00 正在直播 00:00 进入全屏 点击按住可拖动视频

不过我比较喜欢折腾一下,当然Editor的开发模式还能将一些被IDE自动化处理的问题暴露出来,通过解决这些问题也算是一种不错的学习语言机制的方式。在VSCode安装好了Go扩展插件之后,需要安装相应的辅助工具,不过因为一些众所周知的网络原因,基本是不可能安装成功。然后经过一段时间的研究,尝试了不同的方式,例如clone github 上golang tools再安装,或者直接下载各个工具的源码在编译。不过最后是在Go环境内添加了一个代理网站(如下),然后重启VS Code再安装就成功了。这个方式比较方便,所以分享一下。

go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.io,direct

最终根据我自己的习惯,还是会使用Editor来做开发,不过对于像Go这样的高端语言选择IDE还是更高效的解决方案

RESTFUL VS GRAPHQL

Go的服务器路径是通过net/http这个包支持的,虽然可以直接使用net/http来实现RESTful的路径规范,但是对于比较复杂的RESTful接口的话,主程序会比较复杂而且维护性会比较差,这个基本上就是通过一个路由库来处理服务器请求,目前网上有不少相似的路由库可以直接被调用,不过这次基于学习Go的目的,我打算简单写一个路由库,对于RESTful API的路由还是比较简单的,主要就是将路径转换成对应的业务处理函数和对应的参数,如下的一个RESTful API请求:

GET: http://localhost/herb/{id}

通过调用 gorilla/mux 这个路由库可以直接在路径中添加变量,通过如下的一条语句就能完成简单的一个RESTful API的配置

r := mux.NewRouter() r.HandleFunc("/herb/{herbID}",herbGet).Methods(http.MethodGet)

RESTful的接口测试结果

对于GraphQL的支持,Go也是通过第三方库来完成的,也不过尝试了几个开源GraphQL的库,比如“github.com/graphql-go/graphql”,但是没有直接写出一个可用的GraphQL接口,花了大半天查了一些文档,还是无法解决。只能说Go的相关文档和开源库的确不稳定,感觉有点需要瞎猫碰到死耗子的运气。当然,这个完全是因为我还是初次接触Go这门语言,还没有花精力深耕。

结合GraphQL和Go

不过对于Go来说无论是RESTful还是GraphQL的API在开发过程中的效率应该都差不多,基本都是可以调用已有的开源库,如果自己开发相应的库,可能RESTful会更简单一点,毕竟可以直接基于Go的原生库net/http。

数据连接

Go需要添加第三方的数据库驱动来支持mysql,只需要如下将相应的驱动库import就能连接MySQL服务器了。因为驱动不是直接调用,所以添加了一个下划线前缀

import _ “github.com/go-sql-driver/mysql"

不过Go环境中支持的database/sql支持的功能非常简单,就是直接连接和执行查询语句,然后通过遍历查询返回的Rows加入到相应的interface内。而且查了一下有不少第三方数据库Client库可以调用,这样对查询结果的处理会方便很多。不过作为初步尝试,写了一个简单的查询语句,然后将查询语句转存入一个map内。在尝试的过程中充分了解了一下Go对内存指针的机制。虽然不是很直观,不过能发现Go对于内存管理的优势和静态类型的特性。

虽然开始的时候还是花了几个小时了解整体数据查询结果的处理,不过还算基本了解了整体的机制和特性,而且还有可能通过调用第三方库来进一步简化整个开发过程。

语言结构

对于Go的语言结构一开始还是有点不习惯,已经有很长一段时间没有写过静态类型和使用内存指针的编程语言了。而且Go对于变量类型的定义是后置的,有点点的奇怪不是太习惯。

var demoName string

不过整体来说,Go的语言结构还是非常简洁的,而且对于Go中一些新设计用起来还是蛮不错的,例如通过:=来直接完成变量初始化和定义,函数的双变量返回也非常有用。作为编译型的编程语言,Go对于代码的整洁要求还是做得很好,不允许import未用的库和未使用的变量等,这样可以让代码没有任何的浪费空间。Go还能支持加载远程库,这个功能非常重要,对于依赖各种库的Go来说能直接调用,然后编译还是非常方便的。

虽然Go语言结构和之前使用的语言不一样,但是熟悉后就能体会到代码整体的简洁特性。

文档社区

网上已经能找到不少Go的文档,像阿里云或者腾讯开发者社区都有维护一些文档,但是我感觉文档还是Go的一个短板,不是体现在基础参考文档,而是对于一些第三方库的文档或者一些特别问题的解决方案等文档会比较少,尤其是中文的文档。不过Go社区还算是活跃的,而且像在github上使用Go的第三方库的数量应该是前三的。整体来说文档和社区文档比较少,不过能解决问题的第三方库还是非常完善的。

总结

通过简单做了一些Demo体验了一下Go,虽然不能说百分之百了解这门语言,但是还是对于它简洁的语言结构比较欣赏的,也同样有过于依赖开源库的问题,虽然现在绝大多数高级语言都会有这个依赖的问题,使用习惯之后可能也就不成为问题了。最主要的还是Go语言可查看的文档比较有限,尤其官方文档基本上是打不开的,这点上对于后续学习开发还是有一定的障碍。不过鉴于Go还是属于比较年轻的一个编程语言,发展方面还是非常值得期待的。

希望你喜欢这次的分享,如果喜欢的话,可以点赞让我知道一下!如有不同想法或是对之后内容的建议,可以在评论区讨论一下。