我為什麼用GO語言來做區塊鏈?
Go語言現在常常被用來做去中心化系統(decentralised system)。其他型別的公司也都把Go用在產品的核心模組中,並且它在網站開發中也佔據了一席之地。
我們在決定做Karachain的時候,考量(benchmark)了C,C++, Java, 甚至NodeJs,我們也試著用一些演算法來作為考量標準。而現在,我表示我們正在用Go來實現此目標,並且感覺不錯。
啊,現在建造一個區塊鏈,恰如當時建造一個作業系統!
我們在建造像區塊鏈平臺這樣複雜的東西時,把注意力放在了那些核心問題上。經過差不多4周的開發與探索,我們才發現這門奇妙的語言是如何優雅地解答了我們的難題。
1
長期專案中的易維護程式碼
Go語言很簡單。並且每次你中途休息(cessation)之後回到程式碼中時,它沒有那麼多詭異的錯誤(quirk)來浪費你的時間。再加上,它所需要的學習量很少,因為它的語法比較大眾,開發者的學習曲線很平緩,這樣的特性本身就很吸引開發者。這也導致(facilitate)出現Bug的機率很低。所以整個開發過程顯得如此簡單快速。
一般來講,程式碼量越多,專案越難維護。而一個區塊鏈系統需要的程式碼可達幾千行,所以我們需要一門語言,來讓維護變得輕鬆。
2
輕鬆變成Go語言大師
我們初期有20位出色的工程師,大多來自JavaScript, Java, 和Python,也有的是系統工程師,善使C器。
我們自然需要同一個語言來協同工作。說服(convince)他們來學習Go非常容易,但讓他們一個月速成Go語言工程師,卻也是挺簡單。。。我倒不確定選擇其他語言是否也能有此神速。
3
速度與效率
不似Python, Go不是一種解釋型語言——它是編譯型的。這大大地(drastically)減少了在執行中突然出現的Bug。這一點有點像C語言,程式碼先被編譯,錯誤會在編譯時出現並得到處理,然後才能執行;但是,它比C更高階,比JavaScript和Python更具生產力。
一個區塊鏈非常需要高效性,鑑於其使用的是加密(cryptographic)演算法,鑑於它把大量資料傳輸(propagate)於網路,並存儲於網路。
4
為分散式系統而生
這一點,在那些用Golang打造的工具和軟體中顯而易見。Docker,作為一種微服務的容器,也是用Golang打造。
我們已經看到了我們能用Golang打造的微服務輕鬆駕馭百萬數量的請求。
5
Goroutines
併發(Concurrency)是讓幾個程式或者一個程式的幾個部分同時間執行,或者說並行,以提升計算機的吞吐量(throughput)。通常,在Java或其他一些語言中,通過執行緒(threads)來實現併發。而Go則用的是“Goroutines”方法。Goroutines就是說一些函式,它們可以同另外的一些函式同時被執行。一個Goroutine在記憶體中佔用大概4kb,而一個執行緒需要大約1024kb的記憶體。所以,Goroutines同其他語言所使用的執行緒比起來,小了250倍,這使得它也可以同時執行不斷增加的其他Goroutines。
以下是Go語言在處理執行緒方面與Java的不同之處:
在Java中,物件(object)在工作單元間共享,其中某一單元為了訪問到這個資料,必須先得到它的物件鎖。在Golang中,工作單元間共享一種被稱為通道(channel)的東西,一個通道基本上就是一個先入先出通道(FIFO pipe)——工作單元可以向通道發起資料讀寫。
Go語言遵循著它的準則——“不要通過記憶體共享進行通訊,應當通過通訊來共享記憶體”(not to communicate by sharing memory, instead share memory by communicating)。
並行操作對於區塊鏈是有著特殊意義的。同時跑大量函式——這一巧妙而天然的特性使得Go程式靈活地運行於分散式系統,這正是區塊鏈的主要需求。不過這一特性早已被髮掘,有Docker,MongoDB,Netflix,Uber等等等,他們的產品功能也都主要依賴於高併發。
6
區塊鏈領域的所有人都用它
很多基於穩定區塊鏈的DApps和tools都是用的Go語言。你所需要的某個功能,很輕鬆就能找到一個相對應的庫。
Go是編譯型的,所以直接由作業系統執行。這讓我們可以更自如地實現像以太坊沙盒(EVM (Ethereum Virtual Machine))一樣的技術。而如果是Java,因為它本身的執行載體JVM就是一個虛擬機器,要再在上面做一個沙盒,實質是更高一層的抽象,這完全沒有必要,會浪費計算機資源。
當然,Go的使用體驗像是指令碼語言,學習成本很低,所以非常適合小型專案。而在QPS(The Queries per second)上,比起Java好太多,所以又適合用來構建高請求量的服務。
一些美妙的Go程式碼片段
1, 這個是輕易地從一個函式返回一個指標到區域性變數:
2, 你可以在函式內部再定義另外的函式並可以用函式作為返回值,其中的區域性變數會被當做閉包內變數:
3, 基於物件程式設計:
Go語言是簡單而易學的,是簡潔而易懂的。“實用主義”是它的標籤,效能高於觀感。它被設計用於團隊型工作,並且,效果十分出色。
內容來源:部落格園
原文來源:Medium
作者:Naqvi
以下是我們的社群介紹,歡迎各種合作、交流、學習:)