十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
最近三年,在工作中使用go開發(fā)了不少服務(wù)。深感g(shù)o的便捷,以及它的runtime的復(fù)雜。我覺得需要定期的進行總結(jié),因此決定寫這篇文章,也許更準確的,應(yīng)該叫筆記。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的鄄城網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
最近終于解決了一個和cgo有關(guān)的問題。這個問題從發(fā)現(xiàn)到解決前后經(jīng)歷了接近4個月,當然,和人手不足也有關(guān)系。而對于我個人而言,這個問題其實歷時2年!這得從頭說起。
在上一家公司的一個項目里,有一個服務(wù)做音視頻數(shù)據(jù)的提取,這個服務(wù)運行在嵌入式設(shè)備TX2上。音視頻提取這一關(guān)鍵功能主要利用nvidia基于gstreamer開發(fā)的插件,這個插件可以發(fā)揮nvidia gpu的硬件解碼功能。當時這個服務(wù)使用go和c混編的方式,問題的癥狀是服務(wù)運行一段時間后,不輸出音視頻數(shù)據(jù)。遺憾的是,由于疫情,項目停止,因此沒有機會繼續(xù)研究這個問題。
時間來到去年底。當前這個項目進行壓力測試,發(fā)現(xiàn)關(guān)鍵的語音處理服務(wù)運行一段時間后,會出現(xiàn)不拉流的情況,因此也沒有后續(xù)的結(jié)果輸出。癥狀和上一個項目非常像。雖然使用的第三方SDK不一樣,但同樣用了go和c混編的方式。一開始,焦點就放在go的運行時上,覺得可能是go和c相互調(diào)用的方式不對。經(jīng)過合理猜測,并用測試進行驗證后,發(fā)現(xiàn)問題還是在第三方拉流的SDK上,它們的回調(diào)函數(shù)必須要快,否則有可能會阻塞它們的回調(diào)線程。當然,在go調(diào)用c的時候,如果耗時比較長,會對go的運行時造成一些副作用;在c回調(diào)go的時候,go的運行時也有可能阻塞c的回調(diào)線程。但go的運行時已經(jīng)比較成熟,因此我覺得它對這個問題的貢獻不大。以上采用了假設(shè)-驗證的方法,主要的原因還是第三方的拉流SDK不開源。在定位問題的過程中,使用了gdb的gcore來生成堆棧;也搭建了灰度環(huán)境來進行壓力測試,以及完善監(jiān)控,這些都是解決方法的一部分。
正是這一問題,促使我更多的了解go的運行時。而我看得越多,越覺得go的運行時是一個龐大的怪物。因此,抱著能了解一點是一點的心態(tài),不斷的完善這篇筆記。
作為一個測試,作為一個測試開發(fā), 全棧化+管理 是我們未來的發(fā)展方向。已經(jīng)掌握了Java、Python、HTML的你,是不是也想了解下最近異?;鸨腉o語言呢?來吧,讓我們一起了解下。
Go 是一個開源的編程語言 ,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時候發(fā)布了Go 1穩(wěn)定版本?,F(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個活躍的社區(qū)。這三個人都是計算機界的大神,有的參與了C語言的編寫,有的還是數(shù)學(xué)大神,有的還獲得了計算機最高榮譽-圖靈獎。
接下來說說 Go語言的特色 :
簡潔、快速、安全
并行、有趣、開源
內(nèi)存管理、數(shù)組安全、編譯迅速
Go語言的用途 :
Go 語言被設(shè)計成一門應(yīng)用于搭載 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。
對于高性能分布式系統(tǒng)領(lǐng)域而言,Go 語言無疑比大多數(shù)其它語言有著更高的開發(fā)效率。它提供了海量并行的支持,這對于 游戲 服務(wù)端的開發(fā)而言是再好不過了。
Go語言的環(huán)境安裝:
建議直接打開 官方地址因為墻的原因打不開
因為我用的是windows系統(tǒng),這里主要講下Windows系統(tǒng)上使用Go語言來編程。
Windows 下可以使用 .msi 后綴(在下載列表中可以找到該文件,如go1.17.2.windows-amd64.msi)的安裝包來安裝。
默認情況下 .msi 文件會安裝在 c:Go 目錄下。你可以將 c:Gobin 目錄添加到 Path 環(huán)境變量中。添加后你需要重啟命令窗口才能生效。個人建議還是安裝到 Program Files文件夾中。
使用什么開發(fā)工具來對Go語言進行編寫:
個人建議用VS code, 也可以用Sublime Text來編輯。如果你之前看了我講的HTML語言的學(xué)習(xí),肯定已經(jīng)下載了VS code. 那么這時你需要在VS code中下載Go語言的擴展插件。
這里有一個巨大的坑,就是在下載Go的插件和依賴包時,會提示一些包沒有。主要是因為下載的依賴包部分被墻了,只能想別的辦法去下載。
建議參考網(wǎng)頁:
解決vscode中g(shù)olang插件安裝失敗方法
在學(xué)習(xí)go的過程中,使用的是vscode,但是一直提示安裝相關(guān)插件失敗,然后上網(wǎng)查方法,基本上是叫你建立golang.org目錄什么的,結(jié)果全是錯的,而且都是抄襲,很煩。無意之中看到一位博主分享的方法,他也是飽受上述的垃圾博文困擾,然后找到了解決方法,這里向他致敬,秉著讓更多人看到正確解決方法的心,我寫下正確的解決方法,希望對你有所幫助,也可以點開原博主鏈接參考:
Go有一個全球模塊代理,設(shè)置代理再去安裝golang的插件,就可以安裝成功了。步驟有,首先Windows用戶打開Powershell,一個藍色的界面,注意不是cmd!不知道的直接打開window下面的搜索,然后輸入powershell,搜索出來就可以了。
$env:GO111MODULE=“on”
$env:GOPROXY=“”
go env -w GOPROXY=
go env -w GOPRIVATE=*.corp.example.com
然后我們打開VsCode界面,下面會提示安裝插件,我們選擇Install ALL,就會安裝成功
當你在運行Go語言程序時,提示所有的插件包都已經(jīng)安裝成功了時,就可以正常使用了,要不然一堆報錯會讓你非常心煩。
好了,今天先到這里,晚安、下班~
創(chuàng)建 PayPal 的目的是使金融服務(wù)民主化,并使個人和企業(yè)能夠加入并在全球經(jīng)濟中蓬勃發(fā)展。這項工作的核心是 PayPal 的支付平臺,該平臺使用專有技術(shù)和第三方技術(shù)的組合來高效、安全地促進全球數(shù)百萬商家和消費者之間的交易。隨著支付平臺變得越來越大、越來越復(fù)雜,PayPal 尋求對其系統(tǒng)進行現(xiàn)代化改造并縮短新應(yīng)用程序的上市時間。
Go 在生成干凈、高效的代碼方面的有著極高的價值。這些代碼可以隨著軟件部署的擴展而輕松擴展,這使得該語言非常適合支持 PayPal 的目標。
支付處理平臺的核心是 PayPal 用 C++ 開發(fā)的專有 NoSQL 數(shù)據(jù)庫。然而,代碼的復(fù)雜性大大降低了開發(fā)人員發(fā)展平臺的能力。Go 的簡單代碼布局、goroutine(輕量級執(zhí)行線程)和通道(用作連接并發(fā) goroutine 的管道)使 Go 成為 NoSQL 開發(fā)團隊簡化和現(xiàn)代化平臺的自然選擇。
作為概念驗證,一個開發(fā)團隊花了六個月的時間學(xué)習(xí) Go 并在 Go 中從頭開始重新實現(xiàn) NoSQL 系統(tǒng),在此期間,他們還提供了有關(guān)如何在 PayPal 更廣泛地實施 Go 的見解。截至今天,已遷移 30% 的集群以使用新的 NoSQL 數(shù)據(jù)庫。
隨著 PayPal 的平臺變得越來越復(fù)雜,Go 提供了一種輕松簡化大規(guī)模創(chuàng)建和運行軟件的復(fù)雜性的方法。該語言為 PayPal 提供了出色的庫和快速工具,以及并發(fā)、垃圾收集和類型安全。
借助 Go,PayPal 使其開發(fā)人員能夠?qū)⒏鄷r間從 C++ 和 Java 開發(fā)的噪音中解放出來,從而能夠花更多時間查看代碼和進行戰(zhàn)略性思考。
在這個新改寫的 NoSQL 系統(tǒng)取得成功后,PayPal 內(nèi)更多的平臺和內(nèi)容團隊開始采用 Go。Natarajan 目前的團隊負責(zé) PayPal 的構(gòu)建、測試和發(fā)布管道——所有這些都是在 Go 中構(gòu)建的。該公司擁有一個大型構(gòu)建和測試農(nóng)場,它使用 Go 基礎(chǔ)設(shè)施進行完全管理,以支持整個公司的開發(fā)人員的構(gòu)建即服務(wù)(和測試即服務(wù))。
憑借 PayPal 所需的分布式計算能力,Go 是刷新系統(tǒng)的正確語言。PayPal 需要并發(fā)和并行的編程,為高性能和高度可移植性而編譯,并為開發(fā)人員帶來模塊化、可組合的開源架構(gòu)的好處——Go 已經(jīng)提供了所有這些以及更多幫助 PayPal 對其系統(tǒng)進行現(xiàn)代化改造。
安全性和可支持性是 PayPal 的關(guān)鍵問題,該公司的運營管道越來越多地由 Go 主導(dǎo),因為該語言的簡潔性和模塊化幫助他們實現(xiàn)了這些目標。PayPal 對 Go 的部署為開發(fā)人員提供了一個創(chuàng)意平臺,使他們能夠為 PayPal 的全球市場大規(guī)模生產(chǎn)簡單、高效和可靠的軟件。
隨著 PayPal 繼續(xù)使用 Go 對其軟件定義網(wǎng)絡(luò) (SDN) 基礎(chǔ)設(shè)施進行現(xiàn)代化改造,除了更易于維護的代碼外,他們還看到了性能優(yōu)勢。例如,Go 現(xiàn)在為路由器、負載平衡和越來越多的生產(chǎn)系統(tǒng)提供動力。
作為一家全球性企業(yè),PayPal 需要其開發(fā)團隊有效管理兩種規(guī)模:生產(chǎn)規(guī)模,尤其是與許多其他服務(wù)器(如云服務(wù))交互的并發(fā)系統(tǒng);和開發(fā)規(guī)模,尤其是由許多程序員協(xié)同開發(fā)的大型代碼庫(如開源開發(fā))
PayPal 利用 Go 來解決這些規(guī)模問題。該公司的開發(fā)人員受益于 Go 將解釋型動態(tài)類型語言的編程易用性與靜態(tài)類型編譯語言的效率和安全性相結(jié)合的能力。隨著 PayPal 對其系統(tǒng)進行現(xiàn)代化改造,對網(wǎng)絡(luò)和多核計算的支持至關(guān)重要。Go 不僅提供了這種支持,而且提供的速度很快——在單臺計算機上編譯一個大型可執(zhí)行文件最多需要幾秒鐘。
PayPal 目前有 100 多名 Go 開發(fā)人員,未來選擇采用 Go 的開發(fā)人員將更容易獲得該語言的批準,這要歸功于公司已經(jīng)在生產(chǎn)中的許多成功實現(xiàn)。
最重要的是,PayPal 開發(fā)人員使用 Go 提高了他們的生產(chǎn)力。Go 的并發(fā)機制使得編寫充分利用 PayPal 的多核和聯(lián)網(wǎng)機器的程序變得很容易。使用 Go 的開發(fā)人員還受益于它可以快速編譯為機器代碼的事實,并且他們的應(yīng)用程序獲得了垃圾收集的便利和運行時反射的強大功能。
今天 PayPal 的第一類語言是 Java 和 Node,Go 主要用作基礎(chǔ)設(shè)施語言。雖然 Go 可能永遠不會在某些應(yīng)用程序中取代 Node.js,但 Natarajan 正在推動讓 Go 成為 PayPal 的第一類語言。
通過他的努力,PayPal 還在評估遷移到 Google Kubernetes Engine (GKE) 以加快其新產(chǎn)品的上市時間。GKE 是一個用于部署容器化應(yīng)用程序的托管、生產(chǎn)就緒環(huán)境,并帶來了 Google 在開發(fā)人員生產(chǎn)力、自動化操作和開源靈活性方面的最新創(chuàng)新。
對于 PayPal 而言,部署到 GKE 將使 PayPal 更容易部署、更新和管理其應(yīng)用程序和服務(wù),從而實現(xiàn)快速開發(fā)和迭代。此外,PayPal 會發(fā)現(xiàn)更容易運行機器學(xué)習(xí)、通用 GPU、高性能計算和其他受益于 GKE 支持的專用硬件加速器的工作負載。
對 PayPal 來說最重要的是,Go 開發(fā)和 GKE 的結(jié)合使公司能夠輕松擴展以滿足需求,因為 Kubernetes 自動擴展將使 PayPal 能夠處理用戶對服務(wù)不斷增長的需求——在最重要的時候保持它們可用,然后在安靜的時間來省錢。
相比很多其它流行語言,Go的語法相對簡潔。 此篇文章將介紹編程中常用的代碼元素,并展示一份簡單的Go程序代碼,以便讓剛開始學(xué)Go編程的程序員對Go代碼結(jié)構(gòu)有一個大概的印象。
編程和程序代碼元素
簡單來講,編程可以看作是以各種方式控制和組合計算機運行中的各種操作,以達到各種各樣的目的。 一個操作可能從一個硬件設(shè)備讀取、或者向一個硬件設(shè)備寫入一些數(shù)據(jù),從而完成一個特定的任務(wù)。 對于現(xiàn)代計算機來說,最基本的操作是底層計算機指令,比如CPU和GPU指令。 常見的硬件設(shè)備包括內(nèi)存、磁盤、網(wǎng)卡、顯卡,顯示器、鍵盤和鼠標等。
直接操控底層計算機指令進行編程是非常繁瑣和容易出錯的。 高級編程語言通過對底層指令進行一些封裝和對數(shù)據(jù)進行一些抽象,從而使得編程變得直觀和易于理解。
在流行高級編程語言中,一個操作通常是通過函數(shù)(function)調(diào)用或者使用操作符(operator)運算來完成的。 大多數(shù)高級編程語言都支持一些條件和循環(huán)控制語句。 這些條件和循環(huán)控制語句可以看作是特殊的操作。 它們的語法接近于人類語言,因此一個人寫的代碼很容易被其他人理解。
在大多數(shù)高級編程語言中,數(shù)據(jù)通常被抽象為各種類型(type)和值(value)。 一個類型可以看作是值的模板。一個值可以看作是某個類型的實例。 大多數(shù)編程語言支持自定義類型和若干預(yù)聲明類型(即內(nèi)置類型)。 一門語言的類型系統(tǒng)可以說是這門語言的靈魂。
編程中常常會使用大量的值。 一些在編碼階段可確定的值可以用它們的字面形式(literal,即字面量)來表示。 為了編程靈活和不易出錯,其它的值一般使用變量(variable)和(具名)常量(named constant)來表示。
在《Go語言101》中,具名的函數(shù)、具名的值(包括變量和具名常量)、以及定義類型和類型別名將被統(tǒng)稱為代碼要素。 代碼要素名必須為標識符(identifier)。
高級編程語言代碼將被編譯器或者解釋器轉(zhuǎn)換為底層機器碼進行執(zhí)行。 為了幫助編譯器和解釋器解析高級語言代碼,一些單詞將被用做關(guān)鍵字(keyword)。 這些單詞不能被當做標識符使用。
很多現(xiàn)代高級語言使用包(package)來組織代碼。 一個包必須引入(import)另一個包才能使用另一個包中的公有(導(dǎo)出的)代碼要素。 包名和包的引入名也都必須是標識符。
盡管高級編程語言代碼比底層機器指令友好和易懂,我們還是需要一些注釋來幫助自己和其他程序員理解我們所寫的代碼。 在下一節(jié)的程序示例中,我們可以看到很多注釋。
一個簡單的Go示例程序
為了對各種代碼元素有一個更清楚的認識,讓我們來看一個簡短的Go示例程序。 和很多其流行語言一樣,Go使用//來起始一個行注釋,使用一個/*和*/對來包裹一個塊注釋。
下面是這個Go示例程序。請注意閱讀其中的注釋。程序之后有更多解釋。
package main // 指定當前源文件所在的包名
import "math/rand" // 引入一個標準庫包
const MaxRand = 16 // 聲明一個具名整型常量
// 一個函數(shù)聲明
/*
StatRandomNumbers生成一些不大于MaxRand的非負
隨機整數(shù),并統(tǒng)計和返回小于和大于MaxRand/2的隨機數(shù)
個數(shù)。輸入?yún)?shù)numRands指定了要生成的隨機數(shù)的總數(shù)。
*/
func StatRandomNumbers(numRands int) (int, int) {
// 聲明了兩個變量(類型都為int,初始值都為0)
var a, b int
// 一個for循環(huán)代碼塊
for i := 0; i numRands; i++ {
// 一個if-else條件控制代碼塊
if rand.Intn(MaxRand) MaxRand/2 {
a = a + 1
} else {
b++ // 等價于:b = b + 1
}
}
return a, b // 此函數(shù)返回兩個結(jié)果
}
// main函數(shù),或主函數(shù),是一個程序的入口函數(shù)。
func main() {
var num = 100
// 調(diào)用上面聲明的StatRandomNumbers函數(shù),
// 并將結(jié)果賦給使用短聲明語句聲明的兩個變量。
x, y := StatRandomNumbers(num)
// 調(diào)用兩個內(nèi)置函數(shù)(print和println)。
print("Result: ", x, " + ", y, " = ", num, "? ")
println(x+y == num)
}
將上面的程序代碼存盤到一個名為basic-code-element-demo.go 的文件中并使用下列命令運行此程序:
$ go run basic-code-element-demo.go
Result: 46 + 54 = 100? true
在上面的示例程序中,單詞package、import、const、func、var、for、if、else和return均為關(guān)鍵字。 其它大多數(shù)單詞均為標識符。 請閱讀關(guān)鍵字和標識符以獲得更多關(guān)于關(guān)鍵字和標識符的信息。
四個int(一個在第15行,另三個在第13行) 表示內(nèi)置基本類型int。int類型是Go中的基本整數(shù)類型之一。 第5行中的16、第17行中的0、 第20行中的1以及第30行的100均為整型字面量。 第35行的"Result: "是一個字符串字面量。 請閱讀基本類型和它們的字面量表示以獲取更多關(guān)于基本類型和它們的字面量的信息。 Go中的非基本類型(均為組合類型)將在以后的其它文章中介紹和解釋。
第20行是一個賦值語句。 第5行聲明了一個具名常量,叫做MaxRand。 第15行和第30行使用標準變量聲明語句聲明了三個變量。 第17行的變量i以及第33行的變量x和y是使用變量短聲明語句聲明的。 變量a和b在聲明的時候被指定為int類型。 編譯器會自動推導(dǎo)出變量i、num、x和y的類型均為int類型,因為它們的初始值都是整型字面量表示的。 請閱讀常量和變量以獲取什么是類型不確定值、類型推導(dǎo)、賦值、以及如何聲明變量和具名常量。
上面的示例程序中使用了很多操作符,比如第17和19行的小于比較符,第36行的等于比較符==,還有第20和36行的加法運算符+。 第35行中的+不是一個運算符,它是一個字符串字面量中的一個字符。 一個使用操作符的操作中涉及到的值稱為操作值(有時也可稱為運算數(shù))。 請閱讀常用操作符以獲取更多關(guān)于操作符的信息。 更多操作符將在后續(xù)其它文章中介紹。
第35和36行調(diào)用了兩個內(nèi)置函數(shù)print和println。 從第13行到第26行聲明的函數(shù)StatRandomNumbers在第33行被調(diào)用。 第19行也調(diào)用了一個函數(shù) Intn。 這個函數(shù)聲明在math/rand標準庫包中。 請閱讀函數(shù)聲明及函數(shù)調(diào)用以獲取更多關(guān)于函數(shù)聲明及函數(shù)調(diào)用的信息。
(注意,一般print和println這兩個內(nèi)置函數(shù)并不推薦使用。 在正式的項目中,我們應(yīng)該盡量使用fmt標準庫包中聲明的相應(yīng)函數(shù)。 《Go語言101》只在開始的幾篇文章中使用了這兩個函數(shù)。)
第1行指定了當前源文件所處的包的名稱。 一個Go程序的主函數(shù)(main函數(shù))必須被聲明在一個名稱為main的包中。 第3行引入了math/rand標準庫包,并以rand做為引入名。 在這個包中聲明的Intn函數(shù)將在第19行被調(diào)用。 請閱讀代碼包和包引入,以獲取更多關(guān)于代碼包和包引入的信息。
表達式、語句和簡單語句一文中介紹了什么是表達式和語句。特別地,此文列出了所有的簡單語句類型。 在Go代碼中,各種流程控制代碼塊中的某些部分必須為簡單語句,某些部分必須為表達式。
StatRandomNumbers函數(shù)的聲明體中使用了兩個流程控制代碼塊。 其中一個是for循環(huán)代碼塊,它內(nèi)嵌了另外一個代碼塊。 另外一個代碼塊是一個if-else條件控制代碼塊。 請閱讀基本流程控制語法以獲取更多關(guān)于流程控制代碼塊的信息。 更多的特殊的流程控制代碼塊將在以后的其它文章中介紹。
空行常常用來增加代碼的可讀性。 上面的程序中也包涵了很多注釋,但它們大多是為了Go初學(xué)者快速理解的目的而加入的。 我們應(yīng)該盡量使代碼自解釋,只在確實需要解釋的地方進行注釋。
關(guān)于代碼斷行
像很多其它流行編程語言一樣,Go也使用一對大括號{ and }來形成一個顯式代碼塊。但是在Go代碼中,編碼樣式風(fēng)格有一些限制。 比如,很多左大括號{不能被放到下一行。 如果,上面的StatRandomNumbers被修改成如下所示,則上面的示例程序?qū)⒕幾g不通過。
func StatRandomNumbers(numRands int) (int, int)
{ // 編譯錯誤:語法錯誤
var a, b int
for i := 0; i numRands; i++
{ // 編譯錯誤:語法錯誤
if rand.Intn(MaxRand) MaxRand/2
{ // 編譯錯誤:語法錯誤
a = a + 1
} else {
b++
}
}
return a, b
}
一些程序員不是很喜歡這些限制。但是這些限制有兩個好處:
它們使得Go程序編譯得非??臁?/p>
它們使得不同的Go程序員編寫的代碼風(fēng)格類似,從而一個Go程序員寫的代碼很容易被另一個程序員看懂。
我們可以閱讀代碼斷行規(guī)則一文以獲取更多關(guān)于代碼換行規(guī)則的細節(jié)。在目前,我們最好避免將左大括號放在下一行。 或者說,每行的非空起始字符不能是左大括號(但是,請記住,這不是一個普適的規(guī)則
1、學(xué)習(xí)曲線
它包含了類C語法、GC內(nèi)置和工程工具。這一點非常重要,因為Go語言容易學(xué)習(xí),所以一個普通的大學(xué)生花一個星期就能寫出來可以上手的、高性能的應(yīng)用。在國內(nèi)大家都追求快,這也是為什么國內(nèi)Go流行的原因之一。
2、效率
Go擁有接近C的運行效率和接近PHP的開發(fā)效率,這就很有利的支撐了上面大家追求快速的需求。
3、出身名門、血統(tǒng)純正
之所以說Go語言出身名門,是因為我們知道Go語言出自Google公司,這個公司在業(yè)界的知名度和實力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭霸的局面下推出新的編程語言,自然有它的戰(zhàn)略考慮。而且從Go語言的發(fā)展態(tài)勢來看,Google對它這個新的寵兒還是很看重的,Go自然有一個良好的發(fā)展前途。我們看看Go語言的主要創(chuàng)造者,血統(tǒng)純正這點就可見端倪了。
4、組合的思想、無侵入式的接口
Go語言可以說是開發(fā)效率和運行效率二者的完美融合,天生的并發(fā)編程支持。Go語言支持當前所有的編程范式,包括過程式編程、面向?qū)ο缶幊桃约昂瘮?shù)式編程。
5、強大的標準庫
這包括互聯(lián)網(wǎng)應(yīng)用、系統(tǒng)編程和網(wǎng)絡(luò)編程。Go里面的標準庫基本上已經(jīng)是非常穩(wěn)定,特別是我這里提到的三個,網(wǎng)絡(luò)層、系統(tǒng)層的庫非常實用。
6、部署方便
我相信這一點是很多人選擇Go的最大理由,因為部署太方便,所以現(xiàn)在也有很多人用Go開發(fā)運維程序。
7、簡單的并發(fā)
它包含降低心智的并發(fā)和簡易的數(shù)據(jù)同步,我覺得這是Go最大的特色。之所以寫正確的并發(fā)、容錯和可擴展的程序如此之難,是因為我們用了錯誤的工具和錯誤的抽象,Go可以說這一塊做的相當簡單。
8、穩(wěn)定性
Go擁有強大的編譯檢查、嚴格的編碼規(guī)范和完整的軟件生命周期工具,具有很強的穩(wěn)定性,穩(wěn)定壓倒一切。那么為什么Go相比于其他程序會更穩(wěn)定呢?這是因為Go提供了軟件生命周期的各個環(huán)節(jié)的工具,如go
tool、gofmt、go test。
很多朋友可能知道Go語言的優(yōu)勢在哪,卻不知道Go語言適合用于哪些地方。
1、 Go語言作為服務(wù)器編程語言,很適合處理日志、數(shù)據(jù)打包、虛擬機處理、文件系統(tǒng)、分布式系統(tǒng)、數(shù)據(jù)庫代理等;網(wǎng)絡(luò)編程方面。Go語言廣泛應(yīng)用于Web應(yīng)用、API應(yīng)用、下載應(yīng)用等;除此之外,Go語言還可用于內(nèi)存數(shù)據(jù)庫和云平臺領(lǐng)域,目前國外很多云平臺都是采用Go開發(fā)。
2、 其實Go語言主要用作服務(wù)器端開發(fā)。其定位是用來開發(fā)"大型軟件"的,適合于很多程序員一起開發(fā)大型軟件,并且開發(fā)周期長,支持云計算的網(wǎng)絡(luò)服務(wù)。Go語言能夠讓程序員快速開發(fā),并且在軟件不斷的增長過程中,它能讓程序員更容易地進行維護和修改。它融合了傳統(tǒng)編譯型語言的高效性和腳本語言的易用性和富于表達性。
3、 Go語言成功案例。Nsq:Nsq是由Go語言開發(fā)的高性能、高可用消息隊列系統(tǒng),性能非常高,每天能處理數(shù)十億條的消息;
4、 Docker:基于lxc的一個虛擬打包工具,能夠?qū)崿F(xiàn)PAAS平臺的組建。
5、 Packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者
6、 Skynet:分布式調(diào)度框架。
7、 Doozer:分布式同步工具,類似ZooKeeper。
8、 Heka:mazila開源的日志處理系統(tǒng)。
9、 Cbfs:couchbase開源的分布式文件系統(tǒng)。
10、 Tsuru:開源的PAAS平臺,和SAE實現(xiàn)的功能一模一樣。
11、 Groupcache:memcahe作者寫的用于Google下載系統(tǒng)的緩存系統(tǒng)。
12、 God:類似redis的緩存系統(tǒng),但是支持分布式和擴展性。
13、 Gor:網(wǎng)絡(luò)流量抓包和重放工具。
以上的就是關(guān)于go語言能做什么的內(nèi)容介紹了。