奋斗在一线的 Java 开发人员小玖, 有着自己开发一个建站程序的打算, 由于某些缘由, 最终小玖把建站程序的开发语言选定为 Go。其实之前对于Go小玖并没有太多接触, 只能算是个初学者, 所以关于Go的WEB开发从初学角度总结经验, 期望日后能对初学Go语言的小伙伴有帮助, 不过本系列不会从零基础开始介绍, 是针对有一定程序开发基础的同学, Go的一些基础语法不会详细介绍。一、为什么选择 Go有可能好多伙伴会存有疑问, 针对 web 开发有一整套的 Java 框架, 其开发效率高, 技术成熟, 文档以及解决方案也都成熟, 可为啥小玖会选择 Go 呢?Go跟Java实际上差异还是相对较大的, 这实际上是全面考量的成果, 鉴于Go能够处理一些小玖觉得极为关键的问题, 然而Java却恰好难以处理亦或是没法处理的啊。Java它占用的内存是比较高的, 框架一旦启动, 就会直接将内存占满, 这对于小玖那性能欠佳的服务器来说, 运行起来真的是极为吃力的节奏啊 Java的虚拟机机制存在一些不足之处, 没办法动态地去调整内存呢, 像 -Xmx等这类虚拟机参数就无法实现动态调整 Java编译而成的程序是需要依赖JVM环境才能运行的, 然而Go编译之后生成的二进制文件却能够直接运行 , 这种特性对于建站程序后续的交付是非常便利的 Java编译出来的Class很容易被反编译破解掉, 尽管存在一些诸如通过自定义方式来进行加密的方案, 可安全性能相比之下还是差了不少的。小玖知晓的最为安全的那种方案, 依旧得是借助 JNI 去调用二进制文件来进行加密以及验证, 实在是太过繁杂了。就基于以上提及的这些问题而言, 小玖展开了寻觅, 寻觅那长时间才可有的解决方案, 诸如等等之类的均去深入了解过, 然而这些方案始终是存在着一些局限性的, 所以呢, 最终做出的选择是 Go。Go所占用的内存是比较少的, 并且其编译而成的二进制文件, 在源码安全性方面是更具备保障的。Go具备以上所提及的技术方面的优势, 然而同时也存在着一些劣势, 特别是在生态这个领域, 它与Java之间的差距是相当大的。二、Java 与 Go 语言上的差异非 Go 语言专家只谈谈自己使用以来的一些感受。Go 的语法比 Java 更简洁Go的语法呈现出更为简短的特性, 并非如Java那般冗长。然而, 这仅仅属于次要方面, 在更多程度上, 是存在着一种难以确切表述出来的感觉, 当实际运用起来的时候, 便会产生这样的感受。打个比方, 或许更能将这种情形阐释清楚, 比如在Java代码当中, try所具备的语法糖, 助力达成了数据流的关闭操作。try (InputStream bin getInputStream();) { // 各种操作 } catch (IOException e) { e.printStackTrace(); }不用自己关闭数据流这样用起来就很爽而 Go 里存在着好多这样近似的语法, 这致使人们使用起来感到无比的惬意。举例来说, Go 的函数能够直接返回多个参数, 接口只要达成了方法就能自动继承, 诸如此类……Go 的异常处理比 Java 差在Go的语法当中, 相较于抛出异常, 更倾向于直接返回error的实体对象。这便致使了一个问题, 于每一处存有抛出异常可能的位点, 均需判定是不是存在 error 实体予以返回, 接着再去抉择是否施行后续的逻辑。_, err : session.Insert(param.Site) if err ! nil { return err }这就导致逻辑里会有很多这种异常判断。Go同样是支持通过panic函数, 来进行异常抛出的, 然而却不太能够理解, 为何Go并不提倡去使用这个, 大概是由于异常捕获这件事情, 会显得更加麻烦的缘故。Go 的异常捕获需要用到 defer 一起实现才行。defer func() { if err : recover(); err ! nil { response.FailWithError(err.(error), c) } }()Go 的并发处理比 Java 强Go 的多线程实现比 Java 简洁并发能力也更强。只是小玖感受不深切, 尚未切实以自己之力运用 Go 去编写复杂的并发逻辑。Go 与 Java 接口和实体类的不同当中, Go语言里, 只要实现了接口里的所有方法, 便会自动实现该接口。其实体类被称作结构体, 这结构体与c语言的那种结构体是相似的。Go具备包的观念, 不存在过多类的观念, 归属于同一个包的变量以及函数均当作一个整体, 能够在导入包之际进行导入。接着包不可以循环导入, A包导入了B包, 那么B包就不可以再度导入A包了。三、Java 与 Go 技术框架的差异Go 的 Web 框架多且乱如今在 Go 当中, 处于主流状态的 Web 框架存在 Gin、Beego、Echo、Iris 等多种, 数量着实是极多的。主流的Go的ORM框架, 有gorm框架, 还有xorm框架, 等等……这跟Java的那种连同一套能吃遍一整圈的方式方法是全然不同的, 小玖在刚刚开始入门之际最大的疑惑在于, 这些框架存在哪些差异, 它们各自具备什么样的特性呢?向好多从事 Go 开发的人进行了咨询, 然而好像没几个能够回答上来的, 给我的回应皆是这些框架大致都是一样的, 差别不大, 选个用着顺手的就行, 如此这般。Go 的框架更加轻量小玖不晓得该如何表述轻量这个词汇, 从好的方面来讲, 那便是程序更为简洁, 程序启动要更快, 占用的资源会更少。接着代码方面直接是主要的逻辑, 并未采用建造者、观察者之类的设计模式, 代码数量更少, 在框架当中不存在各种判断等复杂的各项逻辑。看源码比 Java 的框架轻松好多。长时间学习的 Java 都没能完全理解透彻, 然而刚开始使用 Go 小玖就已然能够读懂 Gin 的源码, 进而在其上面进行功能定制了。但其要是往差的方面来讲, 那便是Go的Web框架所具备的功能更少, 而少掉的那些用于判断, 以及注入逻辑所用到的部分, 要是想去实现的话, 那就得要自己动手去编写了。比方说, 套装投入使用后, 函数之上添加一个注解, 便能够直观地达成权限校验, 然而, Go好像都是针对一个个接口自行开展判断的。四、Java 与 Go 生态的差异Java于国内的占有率是相当出众的, 一套备受众人知晓的框架, 历经开发时存在的纷杂多样的文档, 技术方案层面涵盖五花八门的教程, 功能达成方面融入琳琅满目的框架自动化配置, 遭遇难题之际亦有林林总总的解决教程以及大佬予以解答。然而, 要是说到 Go 呢, 自从小玖开始开发到如今这么些天的时间里, 所获得的体验并非良好。对于简单的问题, 倒是存在一些博主分享的踩坑经验, 可对于更加深入一些的问题, 基本上就没能够寻觅到与之有用的、相关的文档以及介绍, 即便使用了, 也未曾有什么收获。可能更多时候看源码是唯一的出路。难得的是, Go语言的框架大多更为简洁, 极易寻得关键代码, 其源码阅读起来相对较为轻松。五、总结话说回来, Java的生态相较于Go而言更为出色, 于业务系统开发这一范畴内, 众多功能在Java领域有着极为成熟的解决办法, 其具备开发速度既快又稳定之特性, 即便遭遇问题, 也能够寻觅到前人所留下的案例, 进而可以迅速将问题予以解决 、。改成 Go 的话, 性能会更为优秀, 会更适宜去做一些偏向底层的应用程序研发, 接着就会更加便利地进行对外交付。以上个人的理解