首頁 >後端開發 >Golang >go語言和java的差別有哪些

go語言和java的差別有哪些

青灯夜游
青灯夜游原創
2022-12-14 19:15:0814955瀏覽

區別:1、Go不允許函數重載,java允許;2、Java預設允許多態,Go沒有;3、Go用HTTP協定進行路由配置,java不是;4、Go程式碼可以自動擴展到多個核心,而Java並不總是具有足夠的可擴展性;5、Java物件的方法會有隱藏this指標傳遞,Go沒有;6、Java不支援多繼承,Go支援多繼承;7、 GO採用的是非侵入式接口,而java不是。

go語言和java的差別有哪些

本教學操作環境:windows7系統、GO 1.18&&java8版本、Dell G3電腦。

一、關於Java

#1、Java的用途

首先我們回顧下Java的主要用途與應用場景:

  • 用途一:伺服器後端系統開發(web後端、微服務後端支付系統、業務系統、管理後台,各種後台交互的介面服務)。

  • 用途二:大資料框架的底層實作和Java的API支援。 (Hadoop)。

  • 用途三:其它中間件的底層開發。 (Tomcat、RocketMq、Hbase、Kafka(部分)、SpringCloud,Dubbo...)。

2、Java的優點和特性

  • #做服務端系統效能高。

  • 有虛擬機,跨平台。

  • 功能強大,支援的類別庫多,生態圈類別庫多,開發框架和工具更容易找到。

  • 市場佔有率高,約60%的中國程式設計師都是做Java相關的工作。

二、關於Go

#1、Go的出生原因

##Go語言是Google內部公司大佬開發的,主要起因於Google公司有大量的C程序項目,但是開發起來效率太低,維護成本高,於是就開發了Go語言來提高效率,而且性能只是差一點。
  • (Go是2007年開始研發,2009推出發布)

    2、巨集觀看Go與Java的差異
  • 無虛擬機,不跨平台(這裡的平台指作業系統)(可以運行多個平台,每個平台打不同的二進位套件),需要打包編譯成對應伺服器作業系統版本(windows/linux)的可執行程式(例如windows是exe)。 (註:說go跨平台的是指32位元和64位元相同作業系統之間的跨平台)
  • 因為Go程式直接打包成作業系統可執行的文件,沒有虛擬機器在中間轉換的一層,所以理論上執行效率會更高(理論上更高,實際情況需具體分析)。
  • 比起Java的語言和程式碼寫風格,Go更簡潔,可以用更少的程式碼實現相同的功能。
  • Go語言底層也是C實現的,又做了高並發的設計(Java出生時(1995)還沒有多核cpu,所以他的並發支持後來添加上去的,Go (2009)出生時已經有了多核cpu的電腦,它在設計語言時就考慮了充分利用多核cpu(英特爾2005首次推出多核)的性能),所以性能高,高並發的支持(高並發支持其中指的一個就是充分利用多核心cpu的效能資源,例如go程式預設使用所有cpu(除非自己設定使用多少))也好。

天然的適用一些特定係統的開發,例如區塊鏈類系統(如以太坊底層系統、以太坊上層應用程式),雲端運算和容器(Docker,K8s底層都是go開發的)開發的(大公司自研運維管理專案也大多是用go做底層的開發),網路程式設計(類似java的Netty)。

三、Go語言與Java的具體差異

#1、函數重載

# Go上不允許函數重載,必須有方法和函數的唯一名稱。 java允許函數重載。

2、多態

Java預設允許多態。而,Go沒有。

Java中的多態實作遵循一個原則:當超類別物件引用變數引用子類別物件時,被引用物件的類型而不是引用變數的類型決定了呼叫誰的成員方法,但是這個被呼叫的方法必須是在超類別中定義過的,也就是說被子類別覆蓋的方法。 Java中的多態可以透過基於繼承和基於介面兩種方法來實現。

而在go語言一般不允許不同類型的賦值,即不支持傳統的多型態。 interface是一個例外,可以用不同類型進行賦值只要一個類型實現了該接口,我們就可以將該類型的變數賦給該接口的變數。

3、路由設定

Go語言使用HTTP協定進行路由設定;而java使用Akka.routing.ConsistentHashingRouter和Akka.routing.ScatterGatherFirstCompletedRouter進行路由設定。

4、可擴展性######Go程式碼可以自動擴展到多個核心;而,Java並不總是具有足夠的可擴展性。 ######5、物件傳遞:###

Java中物件的方法會有隱藏的this指針傳遞,而Go語言中物件導向只是換了一種語法形式來表達,沒有隱藏的this指針,即方法施加的目標顯示傳遞,沒有被隱藏。另外方法施加的目標不一定是指標(java傳遞的是指向物件的指標),如果是指標也可以不命名為this。

6、繼承:

Java的繼承透過extends關鍵字完成,不支援多重繼承。 Go語言的繼承透過匿名組合完成:基底類別以Struct的方式定義,子類別只需要把基底類別當作成員放在子類別的定義中,並且可以透過調整基底類別成員的位置改變記憶體佈局,支援多重繼承。

7、介面:

java中的介面作為不同元件中的契約存在,是強制的,類別必須宣告實作了某個接口,需要從該介面繼承。就算是兩個一模一樣的接口但只有名字不一樣,也只能根據類別所聲明的實作接口是否包括該接口來決定該類別是否實作該接口,叫做「侵入式」的接口。

而GO語言中採用的是非侵入式接口,一個類別只需要實作接口要求的所有函數,那我們就說該類別實作了該接口。 GO語言可以透過介面進行介面查詢(介面指向的物件是否實現了另外的介面),類型查詢等。

【相關推薦:Go影片教學程式設計教學

以上是go語言和java的差別有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn