golang和java开发选哪个?为什么?( 二 )


Go提供了一种特殊模式来运行二进制文件并检查运行情况 。这样 。可以测试并证明软件是并发安全的 。
go run -race myapp.go
我真的很欣赏Go 提供了非常有用的基本功能 。即开即用 (https://golang.org/dl/) 。一个很好的例子是同步“ sync” https://golang.org/pkg/sync/ 并发包 。对于“一次”组类型单例模式实现 。可以编写:

golang和java开发选哪个?为什么?

文章插图
包同步还为并发映射实现 。互斥锁 。条件变量和等待组提供了一种结构 。软件包“ atomic” https://golang.org/pkg/sync/atomic/ 还允许并发安全转换和数学运算-实质上是制作并发就绪代码所需的一切 。
指针 。使用指针 。Go可以更好地控制如何分配内存 。垃圾收集器有效负载以及其他Java无法实现的有趣的性能调整 。与Java相比 。Go感觉像是一种更底层的语言 。并且支持更轻松 。更快速的性能优化 。
鸭子打字 。“如果它走路像鸭子 。却像鸭子一样嘎嘎叫 。那它一定是鸭子 。” 这句话在Go中是正确的:无需定义某种结构实现给定的接口 。如果该结构在给定的接口中具有相同签名的方法 。则它将实现它 。作为库的客户端 。可以定义外部库结构所需的任何接口 。在Java中 。对象必须显式声明其实现了接口 。
探查器 。Go的性能分析工具使分析性能问题变得方便 。快捷和容易 。Go中的事件探查器有助于揭示程序所有部分的内存分配和CPU使用情况 。并可以在可视化图形中进行说明 。从而使执行优化性能的操作非常容易 。从Java VisualVM开始 。Java也有许多探查器 。但是它们不像Go探查器那么简单 。相反 。它们的功效取决于JVM的工作 。因此与它们获得的统计信息和垃圾收集器的工作相关 。
CGO 。Go允许对C进行非常简单而强大的集成 。因此可以在Go项目中编写带有C代码片段的平台相关应用程序 。本质上 。CGo使开发人员能够创建调用C代码的Go程序包 。为了排除/包括给定平台的C代码段 。有各种构建器选项 。这些代码段允许应用程序的多平台实现 。
用作参数 。Go函数可以用作变量 。传递给另一个函数或用作结构的字段 。这种多功能性令人耳目一新 。从Java的1.8版本开始 。它结合了lambda的使用 。它们不是真正的函数 。而是单功能对象 。尽管这有助于实现类似于在Go中使用函数的行为 。但这种想法从一开始就存在于Go中 。
明确的代码风格准则 。Go背后的社区充满了支持和热情 。那里有大量关于使用示例和解释进行操作的最佳方法的信息 。
函数可以返回许多参数 。这也是非常有用和不错的 。
golang和java开发选哪个?为什么?

文章插图
Go的缺点
除接口外 。没有多态性 。Go中没有继承多态性 。这意味着如果在同一个程序包中有两个函数具有不同的参数但含义相同 。则必须给它们指定不同的名称 。例如 。使用此代码:
golang和java开发选哪个?为什么?

文章插图
最终会采用许多方法来做相同的事情 。但所有方法都具有不同的名称 。
此外 。如果嵌入结构 。则嵌入式结构仅知道其自己的方法 。而不会知道“宿主”结构的方法 。
错误处理 。完全由你决定返回什么错误以及如何返回错误 。因此作为开发人员 。需要每次都返回错误并相应地传递错误 。毫不奇怪 。错误可能会被隐藏 。这可能是真正的痛苦 。记住要检查错误并把它们传递出去 。这很烦人而且不安全 。
在Java中 。异常要方便得多 。如果它是RuntimeException 。则甚至不必将其添加到函数的签名中 。
golang和java开发选哪个?为什么?

文章插图
没有泛型 。虽然很方便 。但泛型增加了复杂性 。并且当Go类型的创建者键入系统和运行时 。它们被认为代价高昂 。在Go中进行构建时 。基本上必须针对不同的类型重复使用自己或使用代码生成 。
没有注释 。虽然可以用代码生成部分替换编译注释 。但不幸的是 。运行时注释根本不能替换 。这是有道理的 。因为Go不是声明性的 。并且代码中不应包含任何魔术 。我喜欢在Java中使用注释 。因为它们使代码更加优雅 。简单 。
Go中的依赖管理 。最初 。除了“ Gopgk”之外没有任何依赖项管理 。但最终发布的“供应商”实验后来被“ vgo”取代 。然后又被1.10版“ go mod”取代 。
如今 。可以手动更改go.mod文件描述符 。也可以使用各种Go命令(例如“ go get”)进行更改 。不幸的是 。这使得依赖关系变得不稳定 。也没有即开即用的依赖关系管理机制提供的源镜像 。有点可惜 。尤其是因为Java具有诸如Maven和Gradle之类出色的声明式工具来进行依赖关系管理 。它们也可用于构建 。部署和处理其他CD / CI用途 。

推荐阅读