原文地址:https://medium.com/karachain/why-i-am-building-a-blockchain-in-go-6395a60b24dd Go語言現在常常被用來做去中心化系統(decentralised system)。其他類型的公司也都把Go用在產品的核心模塊中,並且 ...
原文地址:https://medium.com/karachain/why-i-am-building-a-blockchain-in-go-6395a60b24dd
Go語言現在常常被用來做去中心化系統(decentralised system)。其他類型的公司也都把Go用在產品的核心模塊中,並且它在網站開發中也占據了一席之地。
我們在決定做Karachain的時候,考量(benchmark)了C,C++, Java, 甚至NodeJs,我們也試著用一些演算法來作為考量標準。而現在,我表示我們正在用Go來實現此目標,並且感覺不錯。
啊,現在建造一個區塊鏈,恰如當時建造一個操作系統!
我們在建造像區塊鏈平臺這樣複雜的東西時,把註意力放在了那些核心問題上。經過差不多4周的開發與探索,我們才發現這門奇妙的語言是如何優雅地解答了我們的難題。
長期項目中的易維護代碼
Go語言很簡單。並且每次你中途休息(cessation)之後回到代碼中時,它沒有那麼多詭異的錯誤(quirk)來浪費你的時間。再加上,它所需要的學習量很少,因為它的語法比較大眾,開發者的學習曲線很平緩,這樣的特性本身就很吸引開發者。這也導致(facilitate)出現Bug的幾率很低。所以整個開發過程顯得如此簡單快速。
一般來講,代碼量越多,項目越難維護。而一個區塊鏈系統需要的代碼可達幾千行,所以我們需要一門語言,來讓維護變得輕鬆。
輕鬆變成Go語言大師
我們初期有20位出色的工程師,大多來自JavaScript, Java, 和Python,也有的是系統工程師,善使C器。
我們自然需要同一個語言來協同工作。說服(convince)他們來學習Go非常容易,但讓他們一個月速成Go語言工程師,卻也是挺簡單。。。我倒不確定選擇其他語言是否也能有此神速。
速度與效率
不似Python, Go不是一種解釋型語言——它是編譯型的。這大大地(drastically)減少了在運行中突然出現的Bug。這一點有點像C語言,代碼先被編譯,錯誤會在編譯時出現並得到處理,然後才能運行;但是,它比C更高級,比JavaScript和Python更具生產力。
一個區塊鏈非常需要高效性,鑒於其使用的是加密(cryptographic)演算法,鑒於它把大量數據傳輸(propagate)於網路,並存儲於網路。
為分散式系統而生
這一點,在那些用Golang打造的工具和軟體中顯而易見。Docker,作為一種微服務的容器,也是用Golang打造。
我們已經看到了我們能用Golang打造的微服務輕鬆駕馭百萬數量的請求。
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等等等,他們的產品功能也都主要依賴於高併發。
區塊鏈領域的所有人都用它
很多基於穩定區塊鏈的DApps和tools都是用的Go語言。你所需要的某個功能,很輕鬆就能找到一個相對應的庫。
Go是編譯型的,所以直接由操作系統執行。這讓我們可以更自如地實現像以太坊沙盒(EVM (Ethereum Virtual Machine))一樣的技術。而如果是Java,因為它本身的運行載體JVM就是一個虛擬機,要再在上面做一個沙盒,實質是更高一層的抽象,這完全沒有必要,會浪費電腦資源。
當然,Go的使用體驗像是腳本語言,學習成本很低,所以非常適合小型項目。而在QPS(The Queries per second)上,比起Java好太多,所以又適合用來構建高請求量的服務。
一些美妙的Go代碼片段
1, 這個是輕易地從一個函數返回一個指針到局部變數:
2, 你可以在函數內部再定義另外的函數並可以用函數作為返回值,其中的局部變數會被當做閉包內變數:
3, 基於對象編程:
Go語言是簡單而易學的,是簡潔而易懂的。“實用主義”是它的標簽,性能高於觀感。它被設計用於團隊型工作,並且,效果十分出色。