Go語言在Centos下的安裝:
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供王屋網(wǎng)站建設(shè)、王屋做網(wǎng)站、王屋網(wǎng)站設(shè)計(jì)、王屋網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、王屋企業(yè)網(wǎng)站模板建站服務(wù),10年王屋做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
注意,以下命令需要以root身份,或者sudo運(yùn)行。
說明,如果要自定義安裝位置的話,需要配置GOROOT環(huán)境變量,所以這里我們采用默認(rèn)的目錄進(jìn)行安裝,就可以不配置GOROOT環(huán)境變量了。
首先去官網(wǎng)下載go的安裝包,這里用的是:go1.5.1.linux-amd64.tar.gz
■ 1,選擇安裝路徑
由于默認(rèn)的go路徑,在/usr/local下, 所以用如下命令,解壓創(chuàng)建/usr/local/go
tar -C /usr/local -xzf go1.5.1.linux-amd64.tar.gz
■ 2,添加PATH環(huán)境變量
vi /etc/profile
然后加入下面這行:
export PATH=$PATH:/usr/local/go/bin
■ 3,建立Go的工作空間(workspace,也就是GOPATH環(huán)境變量指向的目錄)
GO代碼必須在工作空間內(nèi)。工作空間是一個目錄,其中包含三個子目錄:
src ---- 里面每一個子目錄,就是一個包。包內(nèi)是Go的源碼文件
pkg ---- 編譯后生成的,包的目標(biāo)文件
bin ---- 生成的可執(zhí)行文件。
這里,我們在/home目錄下, 建立一個名為gopath(可以不是gopath, 任意名字都可以)的文件夾,
然后再建立三個子文件夾(子文件夾名必須為src、pkg、bin)。如下圖:
■ 4,設(shè)置GOPATH環(huán)境變量
vi /etc/profile
然后加入下面這行:
export GOPATH=/home/gopath
保存后,執(zhí)行以下命令,使環(huán)境變量立即生效:
source /etc/profile
至此,Go語言的環(huán)境已經(jīng)安裝完畢。下面開始 HelloWorld
智能合約調(diào)用是實(shí)現(xiàn)一個 DApp 的關(guān)鍵,一個完整的 DApp 包括前端、后端、智能合約及區(qū)塊 鏈系統(tǒng),智能合約的調(diào)用是連接區(qū)塊鏈與前后端的關(guān)鍵。
我們先來了解一下智能合約調(diào)用的基礎(chǔ)原理。智能合約運(yùn)行在以太坊節(jié)點(diǎn)的 EVM 中。因此要 想調(diào)用合約必須要訪問某個節(jié)點(diǎn)。
以后端程序?yàn)槔?,后端服?wù)若想連接節(jié)點(diǎn)有兩種可能,一種是雙 方在同一主機(jī),此時(shí)后端連接節(jié)點(diǎn)可以采用 本地 IPC(Inter-Process Communication,進(jìn) 程間通信)機(jī)制,也可以采用 RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)機(jī)制;另 一種情況是雙方不在同一臺主機(jī),此時(shí)只能采用 RPC 機(jī)制進(jìn)行通信。
提到 RPC, 讀者應(yīng)該對 Geth 啟動參數(shù)有點(diǎn)印象,Geth 啟動時(shí)可以選擇開啟 RPC 服務(wù),對應(yīng)的 默認(rèn)服務(wù)端口是 8545。。
接著,我們來了解一下智能合約運(yùn)行的過程。
智能合約的運(yùn)行過程是后端服務(wù)連接某節(jié)點(diǎn),將 智能合約的調(diào)用(交易)發(fā)送給節(jié)點(diǎn),節(jié)點(diǎn)在驗(yàn)證了交易的合法性后進(jìn)行全網(wǎng)廣播,被礦工打包到 區(qū)塊中代表此交易得到確認(rèn),至此交易才算完成。
就像數(shù)據(jù)庫一樣,每個區(qū)塊鏈平臺都會提供主流 開發(fā)語言的 SDK(Software Development Kit,軟件開發(fā)工具包),由于 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節(jié)點(diǎn)、發(fā)交易,直接在工程內(nèi)導(dǎo)入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。
總結(jié)一下,智能合約被調(diào)用的兩個關(guān)鍵點(diǎn)是節(jié)點(diǎn)和 SDK。
由于 IPC 要求后端與節(jié)點(diǎn)必須在同一主機(jī),所以很多時(shí)候開發(fā)者都會采用 RPC 模式。除了 RPC,以太坊也為開發(fā)者提供了 json- rpc 接口,本文就不展開討論了。
接下來介紹如何使用 Go 語言,借助 go-ethereum 源碼庫來實(shí)現(xiàn)智能合約的調(diào)用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。
步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應(yīng)用二進(jìn)制接口)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創(chuàng)建該文件,文件名可自定義,后綴最好使用 abi)。
最好能將 calldemo.abi 單獨(dú)保存在一個目錄下,輸入“l(fā)s”命令只能看到 calldemo.abi 文件,參 考效果如下:
步驟 02:獲得合約地址。注意要將合約部署到 Geth 節(jié)點(diǎn)。因此 Environment 選擇為 Web3 Provider。
在【Environment】選項(xiàng)框中選擇“Web3 Provider”,然后單擊【Deploy】按鈕。
部署后,獲得合約地址為:0xa09209c28AEf59a4653b905792a9a910E78E7407。
步驟 03:利用 abigen 工具(Geth 工具包內(nèi)的可執(zhí)行程序)編譯智能合約為 Go 代碼。abigen 工具的作用是將 abi 文件轉(zhuǎn)換為 Go 代碼,命令如下:
其中各參數(shù)的含義如下。 (1)abi:是指定傳入的 abi 文件。 (2)type:是指定輸出文件中的基本結(jié)構(gòu)類型。 (3)pkg:指定輸出文件 package 名稱。 (4)out:指定輸出文件名。 執(zhí)行后,將在代碼目錄下看到 funcdemo.go 文件,讀者可以打開該文件欣賞一下,注意不要修改它。
步驟 04:創(chuàng)建 main.go,填入如下代碼。 注意代碼中 HexToAddress 函數(shù)內(nèi)要傳入該合約部署后的地址,此地址在步驟 01 中獲得。
步驟 04:設(shè)置 go mod,以便工程自動識別。
前面有所提及,若要使用 Go 語言調(diào)用智能合約,需要下載 go-ethereum 工程,可以使用下面 的指令:
該指令會自動將 go-ethereum 下載到“$GOPATH/src/github.com/ethereum/go-ethereum”,這樣還算 不錯。不過,Go 語言自 1.11 版本后,增加了 module 管理工程的模式。只要設(shè)置好了 go mod,下載 依賴工程的事情就不必關(guān)心了。
接下來設(shè)置 module 生效和 GOPROXY,命令如下:
在項(xiàng)目工程內(nèi),執(zhí)行初始化,calldemo 可以自定義名稱。
步驟 05:運(yùn)行代碼。執(zhí)行代碼,將看到下面的效果,以及最終輸出的 2020。
上述輸出信息中,可以看到 Go 語言會自動下載依賴文件,這就是 go mod 的神奇之處??吹?2020,相信讀者也知道運(yùn)行結(jié)果是正確的了。
當(dāng)您的代碼使用外部包時(shí),這些包(作為模塊分發(fā))成為依賴項(xiàng)。隨著時(shí)間的推移,您可能需要升級或更換它們。Go 提供了依賴管理工具,可幫助您在合并外部依賴項(xiàng)時(shí)確保 Go 應(yīng)用程序的安全。
本主題介紹如何執(zhí)行任務(wù)以管理您在代碼中承擔(dān)的依賴項(xiàng)。您可以使用 Go 工具執(zhí)行其中的大部分操作。本主題還介紹了如何執(zhí)行其他一些您可能會覺得有用的依賴相關(guān)任務(wù)。
您可以通過 Go 工具獲取和使用有用的包。在 pkg.go.dev 上,您可以搜索您可能覺得有用的包,然后使用go命令將這些包導(dǎo)入您自己的代碼中以調(diào)用它們的功能。
下面列出了最常見的依賴項(xiàng)管理步驟。
在 Go 中,您將依賴項(xiàng)作為包含您導(dǎo)入的包的模塊來管理。此過程由以下機(jī)構(gòu)支持:
您可以搜索pkg.go.dev以查找具有您可能覺得有用的功能的軟件包。
找到要在代碼中使用的包后,在頁面頂部找到包路徑,然后單擊復(fù)制路徑按鈕將路徑復(fù)制到剪貼板。在您自己的代碼中,將路徑粘貼到導(dǎo)入語句中,如下例所示:
在您的代碼導(dǎo)入包后,啟用依賴項(xiàng)跟蹤并獲取包的代碼進(jìn)行編譯。
要跟蹤和管理您添加的依賴項(xiàng),您首先要將代碼放入其自己的模塊中。這會在源代碼樹的根目錄創(chuàng)建一個 go.mod 文件。您添加的依賴項(xiàng)將列在該文件中。
要將您的代碼添加到它自己的模塊中,請使用 go mod init命令。例如,從命令行切換到代碼的根目錄,然后按照以下示例運(yùn)行命令:
該go mod init命令的參數(shù)是您的模塊的模塊路徑。如果可能,模塊路徑應(yīng)該是源代碼的存儲庫位置。
如果一開始您不知道模塊的最終存儲庫位置,請使用安全的替代品。這可能是您擁有的域的名稱或您控制的另一個名稱(例如您的公司名稱),以及來自模塊名稱或源目錄的路徑。
當(dāng)您使用 Go 工具管理依賴項(xiàng)時(shí),這些工具會更新 go.mod 文件,以便它維護(hù)您的依賴項(xiàng)的當(dāng)前列表。
添加依賴項(xiàng)時(shí),Go 工具還會創(chuàng)建一個 go.sum 文件,其中包含您所依賴的模塊的校驗(yàn)和。Go 使用它來驗(yàn)證下載的模塊文件的完整性,特別是對于在您的項(xiàng)目上工作的其他開發(fā)人員。
在代碼中包含存儲庫中的 go.mod 和 go.sum 文件。
當(dāng)您運(yùn)行g(shù)o mod init創(chuàng)建用于跟蹤依賴項(xiàng)的模塊時(shí),您指定一個模塊路徑作為模塊的名稱。模塊路徑成為模塊中包的導(dǎo)入路徑前綴。一定要指定一個不會與其他模塊的模塊路徑?jīng)_突的模塊路徑。
至少,一個模塊路徑只需要表明它的來源,例如公司或作者或所有者名稱。但是路徑也可能更能描述模塊是什么或做什么。
模塊路徑通常采用以下形式:
1、Go 工具可以在其中找到模塊源代碼的存儲庫的位置。
例如,它可能是github.com/ /.
如果您認(rèn)為您可能會發(fā)布模塊供其他人使用,請使用此最佳實(shí)踐。
2、一個你控制的名字。
如果您不使用存儲庫名稱,請務(wù)必選擇一個您確信不會被其他人使用的前綴。一個不錯的選擇是您公司的名稱。避免使用常用術(shù)語,例如widgets、utilities或 app。
Go 保證以下字符串不會在包名稱中使用。
1、test– 您可以將test用作模塊路徑前綴以便代碼用于在另一個模塊中本地測試功能進(jìn)行測試。
使用test作為模塊路徑前綴是測試的一部分。例如,您的測試本身可能會運(yùn)行g(shù)o mod init test,然后以某種特定方式設(shè)置該模塊,以便使用 Go 源代碼分析工具進(jìn)行測試。
2、example– 在某些 Go 文檔中用作模塊路徑前綴,例如在創(chuàng)建模塊以跟蹤依賴關(guān)系的教程中。
請注意,Go 文檔還用于example.com說明示例何時(shí)可能是已發(fā)布的模塊。
本文介紹一些Go語言的基礎(chǔ)語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來進(jìn)一步介紹go的基礎(chǔ)語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標(biāo)準(zhǔn)庫,
常用方法:
示例代碼:
執(zhí)行結(jié)果:
更多格式化方法可以訪問中的fmt包。
log包實(shí)現(xiàn)了簡單的日志服務(wù),也提供了一些格式化輸出的方法。
執(zhí)行結(jié)果:
下面來介紹一下go的數(shù)據(jù)類型
下表列出了go語言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時(shí)就確定下來的值,程序運(yùn)行時(shí)無法改變。
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
Go 語言的運(yùn)算符主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符以及指針相關(guān)運(yùn)算符。
算術(shù)運(yùn)算符:
關(guān)系運(yùn)算符:
邏輯運(yùn)算符:
位運(yùn)算符:
賦值運(yùn)算符:
指針相關(guān)運(yùn)算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強(qiáng)制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執(zhí)行結(jié)果:
下面介紹幾種循環(huán)語句:
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
也可以通過標(biāo)記退出循環(huán):
--THE END--