(譯)我為什麼用Go語言來做區塊鏈——Syed Jafar Naqvi——Co-Founder/CEO at Karachain

来源:https://www.cnblogs.com/oler/archive/2018/07/12/9297509.html
-Advertisement-
Play Games

原文地址: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語言是簡單而易學的,是簡潔而易懂的。“實用主義”是它的標簽,性能高於觀感。它被設計用於團隊型工作,並且,效果十分出色。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 請求長度的限制 在HTTP協議中,從未規定GET/POST的請求長度限制,對於GET,對url的限制來源於瀏覽器或web伺服器,瀏覽器和伺服器限制了url的長度。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。對於POST,由於沒有url傳值,理論上是不會受到限制的,但是實際上各個服 ...
  • 在我們的項目經常需要監聽一些鍵盤事件來觸發程式的執行,而Vue中允許在監聽的時候添加關鍵修飾符: 對於一些常用鍵,還提供了按鍵別名: 全部的按鍵別名: .enter .tab .delete (捕獲“刪除”和“退格”鍵) .esc .space .up .down .left .right 修飾鍵: ...
  • 問題:有兩個元素: A, B。兩則是嵌套關係,A是B的父節點。A和B都是塊元素。當在A上設置:margin: 0 auto的時候,B並沒有在頁面中居中。 margin: 0 auto 為什麼沒有生效? 解決:margin:0 auto;生效,需要一定的前提條件。 1 兩者是塊元素,即 display ...
  • 下麵是在變數開始的時候定義初始值 ...
  • Description 聰聰和可可是兄弟倆,他們倆經常為了一些瑣事打起來,例如家中只剩下最後一根冰棍而兩人都想吃、兩個人都想玩兒電腦(可是他們家只有一臺電腦)……遇到這種問題,一般情況下石頭剪刀布就好了,可是他們已經玩兒膩了這種低智商的游戲。他們的爸爸快被他們的爭吵煩死了,所以他發明瞭一個新游戲:由 ...
  • 我們在上一篇搭建了一個簡單的springboot應用,這一篇將介紹使用spring-data-jpa操作資料庫。 新建一個MySQL資料庫,這裡資料庫名為springboot,建立user_info數據表,作為我們示例操作的表對象。 user_info信息如下: 資料庫及表創建成功後,回到我們的工程 ...
  • 好久不發文章了,難道是因為忙,其實是因為懶。這是一篇關於線程池使用和基本原理的科普水文,如果你經常用到線程池,不知道你的用法標準不標準,是否有隱藏的 OOM 風險。不經常用線程池的同學,還有對幾種線程的使用不甚瞭解的同學可以讀一下此文。 為什麼要使用線程池 雖然大家應該都已經很清楚了,但還是說一下。 ...
  • 集合 初次學習集合過程中的學習筆記,學習頂層,使用底層.包括常用的API Collection介面 概述 集合 : 集合是Java中提供的一種容器,可以用來存儲多個數據. 與數組的區別: 數組的長度是固定的,集合的長度是可變的. 數組只能存儲同一種數據類型,集合可以存儲任意數據類型. 數組可以存儲基 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...