您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    顺序员技术选型:写Go还是Java?
    时间:2020-09-27 21:01 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    老实说,我很喜欢 Java。我在 Spiral Scout 任务的那几年,运用了 EJB2、DB2 和 Oracle 等后端技术,积聚了很多软件开发方面的专业知识。过去几年,我转向基于自然言语处置的机器人项目,触及的技术包括 Spring Boot、Redis、RabbitMQ、Open NLP、IBM Watson 和 UIMA。不断以来,我选择的言语是 Java,它不断很高效,有时还会觉得它很幽默。

    顺序员技术选型:写Go还是Java?

    1. 初遇 Go

    2017 年终,我接手了一个十分幽默的项目,一个用于监控和种植水培植物的自动化编程系统。项目的原始代码里包含了一个运用 CGo 开发的支持三个不同系统(Windows、MacOS 和 ARM)的网关。

    由于对 Go 不熟习,我一边学习,一边用它来完成功用。由于已有代码库的结构十分复杂,对我来说是难上加难。用 Go 开发的支持三种不同操作系统的顺序意味着需求针对三种不同的系统停止部署、测试和运转维护。此外,代码采用了单例设计形式,招致系统严重相互依赖,难以预测会出现什么成绩,而且难以了解。最后,我选择运用 Java 来完成新版本,但最终也变得十分漂亮和令人困惑。

    在参加 Spiral Scout 后,我尝试中止运用 Java。我决议拥抱 Go,并尽能够多地运用 Go 来开发。我发现它是一种创新且片面的言语,我们的团队如今依然每天在各种项目中运用它。

    但是,与任何一门编程言语一样,Go 也有它的缺陷,而且我不想扯谎——有时分我真的很想念 Java。

    假设说我的编程阅历教会了我什么,那一定是——软件开发没有银弹。我将在这篇文章里详细分享我运用一门传统言语和一门新言语的阅历。

    2. 繁复性

    Go 和 Java 都是 C 家族言语,所以它们具有相似的语法。因此,Java 开发人员可以很容易读懂 Go 代码,反之亦然。Go 不需求在语句末尾运用分号(';'),只要少数状况例外。对我来说,Go 的行分隔方式更明晰,更易读。

    Go 和 Java 都运用了我最喜欢的功用之一,即渣滓搜集器(GC),用来协助避免内存走漏。与 C++ 不同,C 家族的顺序员需求处置内存走漏成绩。渣滓回收器是自动化内存管理的一个特性,减轻了顺序员的担负。

    Go 的 GC 并未运用“弱世代假定”,但它的表现依然十分出色,并且 STW(Stop-the-World)的时间十分短。在 1.5 版中,STW 降得更多,并且很波动,而在 1.8 版中,它降到了 1 毫秒以下。

    Go 的 GC 只要大批的一些选项,即用于设置初始渣滓回收目的百分比的 GOGC 变量。而 Java 有 4 个不同的渣滓回收器,每个渣滓回收器都有少量的选项。

    虽然 Java 和 Go 都被以为是跨平台的,但 Java 需求 Java 虚拟机(JVM)来解释编译后的代码,而 Go 是将代码编译成目的平台的二进制文件。但我以为,与 Go 相比,Java 对平台的依赖水平更低,由于 Go 每次都需求为新平台编译二进制文件。从测试和 DevOps 的角度来看,辨别为不同的平台编译二进制文件十分耗时,并且跨平台的 Go 编译在某些状况下不起作用,尤其是在运用 CGo 时。而关于 Java,你可以在安装了 JVM 的任何中央运用相反的 jar。Go 需求的 RAM 更小一些,并且不需求安装和管理虚拟机。

    反射。Java 的反射更方便、更盛行也更常用,而 Go 的反射似乎更复杂。Java 是一种面向对象的编程言语,因此除原始类型之外的一切东西都被视为对象。假设要运用反射,可以创立一个类,并从类中获取所需的信息,如下所示:

    Class cls = obj.getClass(); 

     

    Constructor constructor = cls.getConstructor(); 

     

    Method[] methods = cls.getDeclaredFields(); 

    这样就可以拜访结构函数、办法和属性,然后调用或对它们赋值。

    Go 没有类的概念,并且结构体只包含了已声明的字段。因此,我们需求借助“reflection”包来取得所需的信息:

    type Foo struct { 

     

    int `tag1:"First Tag" 

     

    tag2:"Second Tag"

     

    B string 

     

     

     

     

    f := Foo{A: 10, B: "Salutations"

     

    fType := reflect.TypeOf(f) 

     

    switch t.Kind(fType) 

     

    case reflect.Struct: 

     

    for i := 0; i < t.NumField(); i++ { 

     

    f := t.Field(i) 

     

    // ... 

     

     

    我觉得这不是一个大成绩,但由于 Go 中没有结构体的结构函数,所以很多原始类型必须独自处置,并且需求思索到指针。在 Go 中,我们可以停止指针传递或值传递。Go 的结构体可以将函数作为字段。一切这些都让 Go 的反射变得愈加复杂。

    可拜访性。Java 有 private、protected 和 public 修饰符,为数据、办法和对象提供了不同的拜访作用域。Go 有与 Java 的 public 和 private 相似的 exported/unexported,但没有修饰符。以大写字母扫尾的一切内容都将被导出,对其他包可见,未导出(小写)的变量或函数仅在以后包中可见。

    3. Go 与 Java 的大不同 (责任编辑:admin)