溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

go語言和java的區(qū)別是什么

發(fā)布時(shí)間:2022-12-15 09:42:00 來源:億速云 閱讀:123 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“go語言和java的區(qū)別是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“go語言和java的區(qū)別是什么”吧!

區(qū)別:1、Go不允許函數(shù)重載,java允許;2、Java默認(rèn)允許多態(tài),Go沒有;3、Go用HTTP協(xié)議進(jìn)行路由配置,java不是;4、Go代碼可以自動(dòng)擴(kuò)展到多個(gè)核心,而Java并不總是具有足夠的可擴(kuò)展性;5、Java對象的方法會(huì)有隱藏this指針傳遞,Go沒有;6、Java不支持多繼承,Go支持多繼承;7、GO采用的是非侵入式接口,而java不是。

一、關(guān)于Java

1、Java的用途

首先我們來回顧下Java的主要用途和應(yīng)用場景:

  • 用途一:服務(wù)器后端系統(tǒng)開發(fā)(web后端、微服務(wù)后端支付系統(tǒng)、業(yè)務(wù)系統(tǒng)、管理后臺(tái),各種后臺(tái)交互的接口服務(wù))。

  • 用途二:大數(shù)據(jù)框架的底層實(shí)現(xiàn)和Java的API支持。(Hadoop)。

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

2、Java的優(yōu)勢和特點(diǎn)

  • 做服務(wù)端系統(tǒng)性能高。

  • 有虛擬機(jī),跨平臺(tái)。

  • 功能強(qiáng)大,支持的類庫多,生態(tài)圈類庫多,開發(fā)框架和工具更易找。

  • 市場占有率高,約60%的中國程序員都是做Java相關(guān)的工作。

二、關(guān)于Go

1、Go的出生原因

Go語言是Google內(nèi)部公司大佬開發(fā)的,主要起因于Google公司有大量的C程序項(xiàng)目,但是開發(fā)起來效率太低,維護(hù)成本高,于是就開發(fā)了Go語言來提高效率,而且性能只是差一點(diǎn)。

(Go是2007年開始研發(fā),2009推出發(fā)布)

2、宏觀看Go與Java的差異

  • 無虛擬機(jī),不跨平臺(tái)(這里的平臺(tái)指操作系統(tǒng))(可以運(yùn)行多個(gè)平臺(tái),每個(gè)平臺(tái)打不同的二進(jìn)制程序包),需要打包編譯成對應(yīng)服務(wù)器操作系統(tǒng)版本(windows/linux)的可執(zhí)行程序(比如windows是exe)。(注:說go跨平臺(tái)的是指32位和64位相同操作系統(tǒng)之間的跨平臺(tái))

  • 因?yàn)镚o程序直接打包成操作系統(tǒng)可執(zhí)行的文件,沒有虛擬機(jī)在中間轉(zhuǎn)換的一層,所以理論上執(zhí)行效率會(huì)更高(理論上更高,實(shí)際情況需具體分析)。

  • 相比Java的語言和代碼編寫風(fēng)格,Go更簡潔,可以用更少的代碼實(shí)現(xiàn)同樣的功能。

  • Go語言底層也是C實(shí)現(xiàn)的,又做了高并發(fā)的設(shè)計(jì)(Java出生時(shí)(1995)還沒有多核cpu,所以他的并發(fā)支持后來添加上去的,Go(2009)出生時(shí)已經(jīng)有了多核cpu的電腦,它在設(shè)計(jì)語言時(shí)就考慮了充分利用多核cpu(英特爾2005首次推出多核)的性能),所以性能高,高并發(fā)的支持(高并發(fā)支持其中指的一個(gè)就是充分利用多核cpu的性能資源,比如go程序默認(rèn)使用所有cpu(除非自己設(shè)置使用多少))也好。

  • 天然的適用一些特定系統(tǒng)的開發(fā),比如區(qū)塊鏈類系統(tǒng)(如以太坊底層系統(tǒng)、以太坊上層應(yīng)用程序),云計(jì)算和容器(Docker,K8s底層都是go開發(fā)的)開發(fā)的(大公司自研運(yùn)維管理項(xiàng)目也大多是用go做底層的開發(fā)),網(wǎng)絡(luò)編程(類似于java的Netty)。

三、Go語言和Java的具體區(qū)別

1、函數(shù)重載

Go上不允許函數(shù)重載,必須具有方法和函數(shù)的唯一名稱。java允許函數(shù)重載。

2、多態(tài)

Java默認(rèn)允許多態(tài)。而,Go沒有。

Java中的多態(tài)實(shí)現(xiàn)遵循一個(gè)原則:當(dāng)超類對象引用變量引用子類對象時(shí),被引用對象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。Java中的多態(tài)可以通過基于繼承和基于接口兩種方法實(shí)現(xiàn)。

而在go語言一般不允許不同類型的賦值,即不支持傳統(tǒng)的多態(tài)。interface是一個(gè)例外,可以用不同類型進(jìn)行賦值只要一個(gè)類型實(shí)現(xiàn)了該接口,我們就可以將該類型的變量賦給該接口的變量。

3、路由配置

Go語言使用HTTP協(xié)議進(jìn)行路由配置;而java使用Akka.routing.ConsistentHashingRouter和Akka.routing.ScatterGatherFirstCompletedRouter進(jìn)行路由配置。

4、可擴(kuò)展性

Go代碼可以自動(dòng)擴(kuò)展到多個(gè)核心;而,Java并不總是具有足夠的可擴(kuò)展性。

5、對象傳遞:

Java中對象的方法會(huì)有隱藏的this指針傳遞,而Go語言中面向?qū)ο笾皇菗Q了一種語法形式來表達(dá),沒有隱藏的this指針,即方法施加的目標(biāo)顯示傳遞,沒有被隱藏。另外方法施加的目標(biāo)不一定是指針(java傳遞的是指向?qū)ο蟮闹羔?,如果是指針也可以不命名為this。

6、繼承:

Java的繼承通過extends關(guān)鍵字完成,不支持多繼承。Go語言的繼承通過匿名組合完成:基類以Struct的方式定義,子類只需要把基類作為成員放在子類的定義中,并且可以通過調(diào)整基類成員的位置改變內(nèi)存布局,支持多繼承。

7、接口:

java中的接口作為不同組件中的契約存在,是強(qiáng)制的,類必須聲明實(shí)現(xiàn)了某接口,需要從該接口繼承。哪怕是兩個(gè)一模一樣的接口但只有名字不一樣,也只能根據(jù)類所聲明的實(shí)現(xiàn)接口是否包括該接口來決定該類是否實(shí)現(xiàn)該接口,叫做“侵入式”的接口。

而GO語言中采用的是非侵入式接口,一個(gè)類只需要實(shí)現(xiàn)接口要求的所有函數(shù),那我們就說該類實(shí)現(xiàn)了該接口。GO語言可以通過接口進(jìn)行接口查詢(接口指向的對象是否實(shí)現(xiàn)了另外的接口),類型查詢等。

到此,相信大家對“go語言和java的區(qū)別是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI