溫馨提示×

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

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

Go語言跟python等其他語言作對(duì)比

發(fā)布時(shí)間:2021-09-04 14:19:53 來源:億速云 閱讀:163 作者:chen 欄目:編程語言

本篇內(nèi)容介紹了“Go語言跟python等其他語言作對(duì)比”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

設(shè)計(jì)Go是為了解決當(dāng)時(shí)Google開發(fā)遇到的問題

大量的C++代碼,同時(shí)又引入了Java和Python

成千上萬的工程師

數(shù)以萬計(jì)行的代碼

分布式的編譯系統(tǒng)

數(shù)百萬的服務(wù)器

Google開發(fā)中的痛點(diǎn)

  • 編譯慢

  • 失控的依賴

  • 每個(gè)工程師只是用了一個(gè)語言里面的一部分

  • 程序難以維護(hù)(可讀性差、文檔不清晰等)

  • 更新的花費(fèi)越來越長

  • 交叉編譯困難

如何解決當(dāng)前的問題和痛點(diǎn)?

Go希望成為互聯(lián)網(wǎng)時(shí)代的C語言。多數(shù)系統(tǒng)級(jí)語言(包括Java和C#)的根本編程哲學(xué)來源于C++,將C++的面向?qū)ο筮M(jìn)一步發(fā)揚(yáng)光大。但是Go語言的設(shè)計(jì)者卻有不同的看法,他們認(rèn)為值得學(xué)習(xí)的是C語言。C語言經(jīng)久不衰的根源是它足夠簡(jiǎn)單。因此,Go語言也是足夠簡(jiǎn)單。

所以,他們當(dāng)時(shí)設(shè)計(jì)Go的目標(biāo)是為了消除各種緩慢和笨重、改進(jìn)各種低效和擴(kuò)展性。Go是由那些開發(fā)大型系統(tǒng)的人設(shè)計(jì)的,同時(shí)也是為了這些人服務(wù)的;它是為了解決工程上的問題,不是為了研究語言設(shè)計(jì);它還是為了讓我們的編程變得更舒適和方便。

但是結(jié)合Google當(dāng)時(shí)內(nèi)部的一些現(xiàn)實(shí)情況,如很多工程師都是C系的,所以新設(shè)計(jì)的語言一定要易學(xué)習(xí);20年沒有出新的語言了,所以新設(shè)計(jì)的語言必須是現(xiàn)代化的(例如內(nèi)置GC)等情況。根據(jù)實(shí)戰(zhàn)經(jīng)驗(yàn),他們向著目標(biāo)設(shè)計(jì)了Go這個(gè)語言。

一、Go語言的特色

  • 沒有繼承多態(tài)的面向?qū)ο?/p>

  • 強(qiáng)一致類型

  • interface不需要顯式聲明(Duck Typing)

  • 沒有異常處理(Error is value)

  • 基于首字母的可訪問特性

  • 不用的import或者變量引起編譯錯(cuò)誤

  • 完整的標(biāo)準(zhǔn)庫包

  • Go內(nèi)置runtime(作用是性能監(jiān)控、垃圾回收等)

二、Go語言的優(yōu)勢(shì)

1、學(xué)習(xí)曲線容易

Go語言語法簡(jiǎn)單,包含了類C語法。因?yàn)镚o語言容易學(xué)習(xí),所以一個(gè)普通的大學(xué)生花幾個(gè)星期就能寫出來可以上手的、高性能的應(yīng)用。在國內(nèi)大家都追求快,這也是為什么國內(nèi)Go流行的原因之一。

Go語言跟python等其他語言作對(duì)比

Go 語言的語法特性簡(jiǎn)直是太簡(jiǎn)單了,簡(jiǎn)單到你幾乎玩不出什么花招,直來直去的,學(xué)習(xí)曲線很低,上手非常快。

2、效率:快速的編譯時(shí)間,開發(fā)效率和運(yùn)行效率高

開發(fā)過程中相較于 Java 和 C++呆滯的編譯速度,Go 的快速編譯時(shí)間是一個(gè)主要的效率優(yōu)勢(shì)。Go擁有接近C的運(yùn)行效率和接近PHP的開發(fā)效率。

Go語言跟python等其他語言作對(duì)比

C 語言的理念是信任程序員,保持語言的小巧,不屏蔽底層且底層友好,關(guān)注語言的執(zhí)行效率和性能。而 Python 的姿態(tài)是用盡量少的代碼完成盡量多的事。于是我能夠感覺到,Go 語言想要把 C 和 Python 統(tǒng)一起來,這是多棒的一件事啊。

Go語言跟python等其他語言作對(duì)比

3、出身名門、血統(tǒng)純正

之所以說Go出身名門,從Go語言的創(chuàng)造者就可見端倪,Go語言絕對(duì)血統(tǒng)純正。其次Go語言出自Google公司,Google在業(yè)界的知名度和實(shí)力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭(zhēng)霸的局面下推出新的編程語言,自然有它的戰(zhàn)略考慮。而且從Go語言的發(fā)展態(tài)勢(shì)來看,Google對(duì)它這個(gè)新的寵兒還是很看重的,Go自然有一個(gè)良好的發(fā)展前途。

Google 親兒子--->Golang(夠浪) ,出身名門,血統(tǒng)純正

4、自由高效:組合的思想、無侵入式的接口

Go語言可以說是開發(fā)效率和運(yùn)行效率二者的融合,天生的并發(fā)編程支持。Go語言支持當(dāng)前所有的編程范式,包括過程式編程、面向?qū)ο缶幊?、面向接口編程、函?shù)式編程。程序員們可以各取所需、自由組合、想怎么玩就怎么玩。

5、強(qiáng)大的標(biāo)準(zhǔn)庫

這包括互聯(lián)網(wǎng)應(yīng)用、系統(tǒng)編程和網(wǎng)絡(luò)編程。Go里面的標(biāo)準(zhǔn)庫基本上已經(jīng)是非常穩(wěn)定了,特別是我這里提到的三個(gè),網(wǎng)絡(luò)層、系統(tǒng)層的庫非常實(shí)用。Go 語言的 lib 庫麻雀雖小五臟俱全。Go 語言的 lib 庫中基本上有絕大多數(shù)常用的庫,雖然有些庫還不是很好,但我覺得不是問題,因?yàn)槲蚁嘈旁谖磥淼陌l(fā)展中會(huì)把這些問題解決掉。

6、部署方便:二進(jìn)制文件,Copy部署

這一點(diǎn)是很多人選擇Go的理由,因?yàn)椴渴鹛奖懔?,所以現(xiàn)在也有很多人用Go開發(fā)運(yùn)維程序。

7、簡(jiǎn)單的并發(fā)

并行和異步編程幾乎無痛點(diǎn)。Go  語言的 Goroutine 和 Channel 這兩個(gè)神器簡(jiǎn)直就是并發(fā)和異步編程的巨大福音。像 C、C++、Java、Python 和  JavaScript 這些語言的并發(fā)和異步方式太控制就比較復(fù)雜了,而且容易出錯(cuò),而 Go  解決這個(gè)問題非常地優(yōu)雅和流暢。這對(duì)于編程多年受盡并發(fā)和異步折磨的編程者來說,完全就是讓人眼前一亮的感覺。Go  是一種非常高效的語言,高度支持并發(fā)性。Go是為大數(shù)據(jù)、微服務(wù)、并發(fā)而生的一種編程語言。

Go  作為一門語言致力于使事情簡(jiǎn)單化。它并未引入很多新概念,而是聚焦于打造一門簡(jiǎn)單的語言,它使用起來異??焖俨⑶液?jiǎn)單。其創(chuàng)新之處是  goroutines 和通道。Goroutines 是 Go 面向線程的輕量級(jí)方法,而通道是 goroutines 之間通信的優(yōu)先方式。

創(chuàng)建  Goroutines 的成本很低,只需幾千個(gè)字節(jié)的額外內(nèi)存,正由于此,才使得同時(shí)運(yùn)行數(shù)百個(gè)甚至數(shù)千個(gè) goroutines  成為可能??梢越柚ǖ缹?shí)現(xiàn) goroutines 之間的通信。Goroutines 以及基于通道的并發(fā)性方法使其非常容易使用所有可用的 CPU  內(nèi)核,并處理并發(fā)的 IO。相較于 Python/Java,在一個(gè) goroutine 上運(yùn)行一個(gè)函數(shù)需要最小的代碼。

Go語言跟python等其他語言作對(duì)比

8、穩(wěn)定性

Go擁有強(qiáng)大的編譯檢查、嚴(yán)格的編碼規(guī)范和完整的軟件生命周期工具,具有很強(qiáng)的穩(wěn)定性,穩(wěn)定壓倒一切。那么為什么Go相比于其他程序會(huì)更穩(wěn)定呢?這是因?yàn)镚o提供了軟件生命周期(開發(fā)、測(cè)試、部署、維護(hù)等等)的各個(gè)環(huán)節(jié)的工具,如go  tool、gofmt、go test。

三、對(duì)比其他語言

Go的很多語言特性借鑒與它的三個(gè)祖先:C,Pascal和CSP。Go的語法、數(shù)據(jù)類型、控制流等繼承于C,Go的包、面對(duì)對(duì)象等思想來源于Pascal分支,而Go的語言特色,基于管道通信的協(xié)程并發(fā)模型,則借鑒于CSP分支。

Go語言跟python等其他語言作對(duì)比

Java

編譯語言,速度適中(2.67s),目前的大型網(wǎng)站都是拿java寫的,比如淘寶、京東等。主要特點(diǎn)是穩(wěn)定,開源性好,具有自己的一套編寫規(guī)范,開發(fā)效率適中,目前最主流的語言。

作為編程語言中的大腕。具有知名度和用戶群。無論風(fēng)起云涌,我自巍然不動(dòng)。他強(qiáng)任他強(qiáng),清風(fēng)拂山崗;他橫由他橫,明月照大江。

c#

執(zhí)行速度快(4.28),學(xué)習(xí)難度適中,開發(fā)速度適中。但是由于c#存在很多缺點(diǎn),京東、攜程等大型網(wǎng)站前身都是用c#開發(fā)的,但是現(xiàn)在都遷移到了java上。

C/C++

現(xiàn)存編程語言中的老祖,其他語言皆由此而生。執(zhí)行速度最快。但是寫起來最為復(fù)雜,開發(fā)難度大。

Javascript

編程語言中特立獨(dú)行的傲嬌美女。前端處理能力是其它語言無法比擬。發(fā)展中的js后端處理能力也是不凡。前后端通吃,舍我其誰?

Python

腳本語言,速度最慢(258s),代碼簡(jiǎn)潔、學(xué)習(xí)進(jìn)度短,開發(fā)速度快。豆瓣就是拿python寫的。Python著名的服務(wù)器框架有django,flask。但是python在大型項(xiàng)目上不太穩(wěn)定,因此有些用python的企業(yè)后來遷移到了java上。

scala

編譯語言,比python快十倍,和java差不多,但是學(xué)習(xí)進(jìn)度慢,而且在實(shí)際編程中,如果對(duì)語言不夠精通,很容易造成性能嚴(yán)重下降。,后來比如Yammer就從scala遷移到了java上。微服務(wù)框架有l(wèi)agom等。

Go

編程界的小鮮肉。即具有像Python一樣的簡(jiǎn)潔代碼、開發(fā)速度,又具有C語言一樣的執(zhí)行效率,優(yōu)勢(shì)突出。

四、總結(jié)

因?yàn)镚o的語法和Erlang、Python類似,所以我們將這三門語言做個(gè)詳細(xì)的對(duì)比。

相比于Python的40個(gè)特性,Go只有31個(gè),可以說Go在語言設(shè)計(jì)上是相當(dāng)克制的。比如,它沒有隱式的數(shù)值轉(zhuǎn)換,沒有構(gòu)造函數(shù)和析構(gòu)函數(shù),沒有運(yùn)算符重載,沒有默認(rèn)參數(shù),也沒有繼承,沒有泛型,沒有異常,沒有宏,沒有函數(shù)修飾,更沒有線程局部存儲(chǔ)。

但是Go的特點(diǎn)也很鮮明,比如,它擁有協(xié)程、自動(dòng)垃圾回收、包管理系統(tǒng)、一等公民的函數(shù)、??臻g管理等。

Go作為靜態(tài)類型語言,保證了Go在運(yùn)行效率、內(nèi)存用量、類型安全都要強(qiáng)于Python和Erlang。

Go的數(shù)據(jù)類型也更加豐富,除了支持表、字典等復(fù)雜的數(shù)據(jù)結(jié)構(gòu),還支持指針和接口類型,這是Python和Erlang所沒有的。特別是接口類型特別強(qiáng)大,它提供了管理類型系統(tǒng)的手段。而指針類型提供了管理內(nèi)存的手段,這讓Go進(jìn)入底層軟件開發(fā)提供了強(qiáng)有力的支持。

Go在面對(duì)對(duì)象的特性支持上做了很多反思和取舍,它沒有類、虛函數(shù)、繼承、泛型等特性。Go語言中面向?qū)ο缶幊痰暮诵氖墙M合和方法(function)。組合很類似于C語言的struct結(jié)構(gòu)體的組合方式,方法類似于Java的接口(Interface),但是使用方法上與對(duì)象更加解耦,減少了對(duì)對(duì)象內(nèi)部的侵入。Erlang則不支持面對(duì)對(duì)象編程范式,相比而言,Python對(duì)面對(duì)對(duì)象范式的支持最為全面。

在函數(shù)式編程的特性支持上,Erlang作為函數(shù)式語言,支持最為全面。但是基本的函數(shù)式語言特性,如lambda、高階函數(shù)、curry等,三種語言都支持。

控制流的特性支持上,三種語言都差不多。Erlang支持尾遞歸優(yōu)化,這給它在函數(shù)式編程上帶來便利。而Go在通過動(dòng)態(tài)擴(kuò)展協(xié)程棧的方式來支持深度遞歸調(diào)用。Python則在深度遞歸調(diào)用上經(jīng)常被爆棧。

Go和Erlang的并發(fā)模型都來源于CSP,但是Erlang是基于actor和消息傳遞(mailbox)的并發(fā)實(shí)現(xiàn),Go是基于goroutine和管道(channel)的并發(fā)實(shí)現(xiàn)。不管Erlang的actor還是Go的goroutine,都滿足協(xié)程的特點(diǎn):由編程語言實(shí)現(xiàn)和調(diào)度,切換在用戶態(tài)完成,創(chuàng)建銷毀開銷很小。至于Python,其多線程的切換和調(diào)度是基于操作系統(tǒng)實(shí)現(xiàn),而且因?yàn)镚IL的大坑級(jí)存在,無法真正做到并行。

而且從筆者的并發(fā)編程體驗(yàn)上看,Erlang的函數(shù)式編程語法風(fēng)格和其OTP   behavior框架提供的晦澀的回調(diào)(callback)使用方法,對(duì)大部分的程序員,如C/C++和Java出身的程序員來說,有一定的入門門檻和挑戰(zhàn)。而被稱為“互聯(lián)網(wǎng)時(shí)代的C”的Go,其類C的語法和控制流,以及面對(duì)對(duì)象的編程范式,編程體驗(yàn)則好很多。

“Go語言跟python等其他語言作對(duì)比”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

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

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

AI