轉(zhuǎn)載:https://mp.weixin.qq.com/s/wG2uQJxzP5uZLHM8r9Ac_w
所有鏈圈的朋友都該有的常識:Go語言現(xiàn)被用來做去中心化系統(tǒng)(decentralised system)谜叹。
當(dāng)然,其他類型的公司也都把Go用在產(chǎn)品的核心模塊中搬葬,并且它在網(wǎng)站開發(fā)中也占據(jù)了一席之地荷腊。
長期項(xiàng)目中的易維護(hù)代碼
Go語言很簡單。并且每次你中途休息(cessation)之后回到代碼中時(shí)踩萎,它沒有那么多詭異的錯誤(quirk)來浪費(fèi)你的時(shí)間停局。再加上,它所需要的學(xué)習(xí)量很少香府,因?yàn)樗恼Z法比較大眾,開發(fā)者的學(xué)習(xí)曲線很平緩码倦,這樣的特性本身就很吸引開發(fā)者企孩。這也導(dǎo)致(facilitate)出現(xiàn)Bug的幾率很低。所以整個開發(fā)過程顯得如此簡單快速袁稽。
一般來講勿璃,代碼量越多,項(xiàng)目越難維護(hù)。而一個區(qū)塊鏈系統(tǒng)需要的代碼可達(dá)幾千行补疑,所以我們需要一門語言歧沪,來讓維護(hù)變得輕松。
速度與效率
不似Python, Go不是一種解釋型語言——它是編譯型的莲组。這大大地(drastically)減少了在運(yùn)行中突然出現(xiàn)的Bug诊胞。這一點(diǎn)有點(diǎn)像C語言,代碼先被編譯锹杈,錯誤會在編譯時(shí)出現(xiàn)并得到處理撵孤,然后才能運(yùn)行;但是竭望,它比C更高級邪码,比JavaScript和Python更具生產(chǎn)力。
一個區(qū)塊鏈非常需要高效性咬清,鑒于其使用的是加密(cryptographic)算法闭专,鑒于它把大量數(shù)據(jù)傳輸(propagate)于網(wǎng)絡(luò),并存儲于網(wǎng)絡(luò)旧烧。
為分布式系統(tǒng)而生
這一點(diǎn)喻圃,在那些用Golang打造的工具和軟件中顯而易見。Docker粪滤,作為一種微服務(wù)的容器斧拍,也是用Golang打造。
我們能用Golang打造的微服務(wù)輕松駕馭百萬數(shù)量的請求杖小。
Go語言在處理線程方面與Java的不同之處:
在Java中肆汹,對象(object)在工作單元間共享,其中某一單元為了訪問到這個數(shù)據(jù)予权,必須先得到它的對象鎖昂勉。在Golang中,工作單元間共享一種被稱為信道(channel)的東西扫腺,一個信道基本上就是一個先入先出通道(FIFO pipe)——工作單元可以向信道發(fā)起數(shù)據(jù)讀寫岗照。
Go語言遵循著它的準(zhǔn)則——“不要通過內(nèi)存共享進(jìn)行通訊,應(yīng)當(dāng)通過通訊來共享內(nèi)存”(not to communicate by sharing memory, instead share memory by communicating)笆环。
并行操作對于區(qū)塊鏈?zhǔn)怯兄厥庖饬x的攒至。同時(shí)跑大量函數(shù)——這一巧妙而天然的特性使得Go程序靈活地運(yùn)行于分布式系統(tǒng),這正是區(qū)塊鏈的主要需求躁劣。不過這一特性早已被發(fā)掘迫吐,有Docker,MongoDB账忘,Netflix志膀,Uber等等等熙宇,他們的產(chǎn)品功能也都主要依賴于高并發(fā)。
區(qū)塊鏈領(lǐng)域的所有人都用它
很多基于穩(wěn)定區(qū)塊鏈的DApps和tools都是用的Go語言溉浙。你所需要的某個功能烫止,很輕松就能找到一個相對應(yīng)的庫。
Go是編譯型的戳稽,所以直接由操作系統(tǒng)執(zhí)行馆蠕。這讓我們可以更自如地實(shí)現(xiàn)像以太坊沙盒(EVM (Ethereum Virtual Machine))一樣的技術(shù)。而如果是Java广鳍,因?yàn)樗旧淼倪\(yùn)行載體JVM就是一個虛擬機(jī)荆几,要再在上面做一個沙盒,實(shí)質(zhì)是更高一層的抽象赊时,這完全沒有必要吨铸,會浪費(fèi)計(jì)算機(jī)資源。
當(dāng)然祖秒,Go的使用體驗(yàn)像是腳本語言诞吱,學(xué)習(xí)成本很低,所以非常適合小型項(xiàng)目竭缝。而在QPS(The Queries per second)上房维,比起Java好太多,所以又適合用來構(gòu)建高請求量的服務(wù)抬纸。
一些美妙的Go代碼片段
1咙俩, 這個是輕易地從一個函數(shù)返回一個指針到局部變量:
Go 沒有class,而是松耦合的類型湿故、方法對接口的實(shí)現(xiàn)阿趁。
GO 語言最重要的三個方面分別是:封裝,繼承和多態(tài)坛猪,在 Go 中它們是怎樣表現(xiàn)的呢脖阵?
封裝(數(shù)據(jù)隱藏):和別的?OO 語言有 4 個或更多的訪問層次相比,Go 把它簡化為了 2 層:
1)包范圍內(nèi)的:通過標(biāo)識符首字母小寫墅茉,對象 只在它所在的包內(nèi)可見
2)可導(dǎo)出的:通過標(biāo)識符首字母大寫命黔,對象 對所在包以外也可見
類型只擁有自己所在包中定義的方法。
繼承:用組合實(shí)現(xiàn):內(nèi)嵌一個(或多個)包含想要的行為(字段和方法)的類型就斤;多重繼承可以通過內(nèi)嵌多個類型實(shí)現(xiàn)
多態(tài):用接口實(shí)現(xiàn):某個類型的實(shí)例可以賦給它所實(shí)現(xiàn)的任意接口類型的變量悍募。類型和接口是松耦合的,并且多重繼承可以通過實(shí)現(xiàn)多個接口實(shí)現(xiàn)战转。Go 接口不是 Java ?接口的變體搜立,而且:接口間是不相關(guān)的,并且是大規(guī)模編程和可適應(yīng)的演進(jìn)型設(shè)計(jì)的關(guān)鍵槐秧。
綜上所述啄踊,GO的優(yōu)點(diǎn)極多,而且非常適用于區(qū)塊鏈行業(yè)刁标!
Skycoin的CX語言就是基于Go語言颠通,獨(dú)家定制的區(qū)塊鏈專用語言!
CX語言的優(yōu)勢
因此目前沒有一個電腦程序是具有確定性的膀懈。如果是在為飛機(jī)顿锰、導(dǎo)彈和衛(wèi)星編程,這個問題就顯得更嚴(yán)重了启搂。設(shè)想一下硼控,將衛(wèi)星發(fā)射到太空,然后程序發(fā)生錯誤胳赌,數(shù)以萬計(jì)的衛(wèi)星無法運(yùn)行牢撼,為此付出的代價(jià)就很高。
對于區(qū)塊鏈來說疑苫,這也是一個大問題熏版。就如以太坊智能合約,每周有資產(chǎn)被盜捍掺,讓人擔(dān)憂撼短。這種情況已經(jīng)持續(xù)多年了,一直沒有人能解決挺勿。
為解決這些問題曲横,Skycoin決定開發(fā)一種安全、快速且具有確定性的區(qū)塊鏈編程語言——CX語言不瓶。
CX語言將字節(jié)序列化禾嫉,可將其發(fā)送到另一臺電腦,然后恢復(fù)執(zhí)行湃番,這一功能目前各類編程語言都無法實(shí)現(xiàn)夭织。CX語言具有確定性,每個任務(wù)都有一個標(biāo)準(zhǔn)的序列化方式吠撮,序列化后可將其發(fā)送到整個網(wǎng)絡(luò)中尊惰,這對于區(qū)塊鏈編程是非常重要的。
而且CX語言簡單易學(xué)泥兰,它看起來和Golang非常像弄屡,在主循環(huán)中它也有結(jié)構(gòu)、函數(shù)以及數(shù)據(jù)包鞋诗。任何Golang膀捷、C#或者Java開發(fā)者可以在10或20分鐘的時(shí)間內(nèi)用CX語言開始編寫區(qū)塊鏈應(yīng)用程序。
另外削彬,CX語言具有可見性全庸。CX的可見性使你能夠指定哪些函數(shù)可調(diào)用秀仲、誰可調(diào)用,這對于安全性的影響十分重大壶笼。
例如我有一個智能合約函數(shù)神僵,不希望所有人調(diào)用這個函數(shù),我可以限制只有某個人或者符合某個條件才能調(diào)用覆劈,甚至設(shè)定沒有人能調(diào)用這個函數(shù)保礼。CX語言具有可見性,使“誰能調(diào)用什么”的問題形式化责语。但在DAO和以太坊區(qū)塊鏈上炮障,人們把資產(chǎn)放到智能合約里,然后有人調(diào)用程序偷走了資產(chǎn)坤候。
利用CX語言的可見性可更新合約胁赢。假如一家公司在區(qū)塊鏈上運(yùn)營,其合約有漏洞铐拐,但沒有辦法修復(fù)徘键,因?yàn)橐坏┙⒘酥悄芎霞s就無法進(jìn)行更新。
但有了可見性遍蟋,我們可以指定誰能修改智能合約吹害,因此有人能夠修復(fù)這個漏洞。以太坊的主要問題也表現(xiàn)在這里虚青,一旦建立了智能合約它呀,沒有人能更改它。
CX也可以用于人工智能和機(jī)器學(xué)習(xí)棒厘。舉個簡單的例子纵穿,假設(shè)你有一串點(diǎn),你希望電腦能幫你設(shè)計(jì)一個函數(shù)來覆蓋這些點(diǎn)奢人,你現(xiàn)在不需要告訴電腦怎么做谓媒,只需告訴電腦你想要解決的問題,然后電腦開始隨機(jī)嘗試何乎,利用可見性找到最終的解決方法句惯。
CX數(shù)據(jù)包可以自動帶入不同的解決方案并選擇解決問題的最佳方案,這是其他語言無法做到的支救。事實(shí)上抢野,在不斷開發(fā)新的解決方案,在人工智能各墨、生物學(xué)以及機(jī)器學(xué)習(xí)等領(lǐng)域指孤,CX語言的這些特性都非常有用。
一般的編程語言在運(yùn)行程序時(shí)無法看到運(yùn)行過程贬堵,也無法得知下一步恃轩。而CX語言除了看到運(yùn)行過程结洼,還可以查看對象和數(shù)據(jù),查看一共有多少對象详恼、占用了多少內(nèi)存补君。
對使用者來說引几,可以看到程序當(dāng)下的進(jìn)程昧互,幫助排錯;對于區(qū)塊鏈應(yīng)用程序用戶來說伟桅,他們可以知道每個應(yīng)用消耗了多少內(nèi)存敞掘,有多少任務(wù)并檢查程序的運(yùn)行狀態(tài)。