真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言編寫接口教程,go語言基礎(chǔ)教程

如何學(xué)習(xí)GO語言?

Go語言也稱 Golang,兼具效率、性能、安全、健壯等特性。這套Go語言教程(Golang教程)通俗易懂,深入淺出,既適合沒有基礎(chǔ)的讀者快速入門,也適合工作多年的程序員查閱知識點。

創(chuàng)新互聯(lián)2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站建設(shè)、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元湘橋做網(wǎng)站,已為上家服務(wù),為湘橋各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

Go 語言

這套教程在講解一些知識點時,將 Go 語言和其他多種語言進(jìn)行對比,讓掌握其它編程語言的讀者能迅速理解 Go 語言的特性。Go語言從底層原生支持并發(fā),無須第三方庫、開發(fā)者的編程技巧和開發(fā)經(jīng)驗就可以輕松搞定。

Go語言(或 Golang)起源于 2007 年,并在 2009 年正式對外發(fā)布。Go 是非常年輕的一門語言,它的主要目標(biāo)是“兼具 Python 等動態(tài)語言的開發(fā)速度和 C/C++ 等編譯型語言的性能與安全性”。

Go語言是編程語言設(shè)計的又一次嘗試,是對類C語言的重大改進(jìn),它不但能讓你訪問底層操作系統(tǒng),還提供了強大的網(wǎng)絡(luò)編程和并發(fā)編程支持。Go語言的用途眾多,可以進(jìn)行網(wǎng)絡(luò)編程、系統(tǒng)編程、并發(fā)編程、分布式編程。

Go語言的推出,旨在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,具有“部署簡單、并發(fā)性好、語言設(shè)計良好、執(zhí)行性能好”等優(yōu)勢,目前國內(nèi)諸多 IT 公司均已采用Go語言開發(fā)項目。Go語言有時候被描述為“C 類似語言”,或者是“21 世紀(jì)的C語言”。Go 從C語言繼承了相似的表達(dá)式語法、控制流結(jié)構(gòu)、基礎(chǔ)數(shù)據(jù)類型、調(diào)用參數(shù)傳值、指針等很多思想,還有C語言一直所看中的編譯后機器碼的運行效率以及和現(xiàn)有操作系統(tǒng)的無縫適配。

因為Go語言沒有類和繼承的概念,所以它和 Java 或 C++ 看起來并不相同。但是它通過接口(interface)的概念來實現(xiàn)多態(tài)性。Go語言有一個清晰易懂的輕量級類型系統(tǒng),在類型之間也沒有層級之說。因此可以說Go語言是一門混合型的語言。

此外,很多重要的開源項目都是使用Go語言開發(fā)的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。Go 是編譯型語言,Go 使用編譯器來編譯代碼。編譯器將源代碼編譯成二進(jìn)制(或字節(jié)碼)格式;在編譯代碼時,編譯器檢查錯誤、優(yōu)化性能并輸出可在不同平臺上運行的二進(jìn)制文件。要創(chuàng)建并運行 Go 程序,程序員必須執(zhí)行如下步驟。

使用文本編輯器創(chuàng)建 Go 程序;

保存文件;編譯程序;運行編譯得到的可執(zhí)行文件。

這不同于 Python、Ruby 和 JavaScript 等語言,它們不包含編譯步驟。Go 自帶了編譯器,因此無須單獨安裝編譯器。

鏈喬教育在線旗下學(xué)碩創(chuàng)新區(qū)塊鏈技術(shù)工作站是中國教育部學(xué)校規(guī)劃建設(shè)發(fā)展中心開展的“智慧學(xué)習(xí)工場2020-學(xué)碩創(chuàng)新工作站 ”唯一獲準(zhǔn)的“區(qū)塊鏈技術(shù)專業(yè)”試點工作站。專業(yè)站立足為學(xué)生提供多樣化成長路徑,推進(jìn)專業(yè)學(xué)位研究生產(chǎn)學(xué)研結(jié)合培養(yǎng)模式改革,構(gòu)建應(yīng)用型、復(fù)合型人才培養(yǎng)體系。

GO語言(十三):使用 Go 和 Gin 開發(fā) RESTful API(下)

當(dāng)客戶端在 發(fā)出POST請求時/albums,您希望將請求正文中描述的專輯添加到現(xiàn)有專輯數(shù)據(jù)中。

為此,您將編寫以下內(nèi)容:

1、編寫代碼

a.添加代碼以將專輯數(shù)據(jù)添加到專輯列表。

在此代碼中:

1)用于Context.BindJSON 將請求正文綁定到newAlbum。

2) album將從 JSON 初始化的結(jié)構(gòu)附加到albums 切片。

3)向響應(yīng)添加201狀態(tài)代碼,以及表示您添加的專輯的 JSON。

b.更改您的main函數(shù),使其包含該router.POST函數(shù),如下所示。

在此代碼中:

1)將路徑中的POST方法與 /albumspostAlbums函數(shù)相關(guān)聯(lián)。

使用 Gin,您可以將處理程序與 HTTP 方法和路徑組合相關(guān)聯(lián)。這樣,您可以根據(jù)客戶端使用的方法將發(fā)送到單個路徑的請求單獨路由。

a.如果服務(wù)器從上一節(jié)開始仍在運行,請停止它。

b.從包含 main.go 的目錄中的命令行,運行代碼。

c.從不同的命令行窗口,用于curl向正在運行的 Web 服務(wù)發(fā)出請求。

該命令應(yīng)顯示添加專輯的標(biāo)題和 JSON。

d.與上一節(jié)一樣,使用curl檢索完整的專輯列表,您可以使用它來確認(rèn)添加了新專輯。

該命令應(yīng)顯示專輯列表。

當(dāng)客戶端向 發(fā)出請求時GET /albums/[id],您希望返回 ID 與id路徑參數(shù)匹配的專輯。

為此,您將:

a.在您在上一節(jié)中添加的函數(shù)下方postAlbums,粘貼以下代碼以檢索特定專輯。

此getAlbumByID函數(shù)將提取請求路徑中的 ID,然后找到匹配的專輯。

在此代碼中:

(1)Context.Param用于從 URL 中檢索id路徑參數(shù)。當(dāng)您將此處理程序映射到路徑時,您將在路徑中包含參數(shù)的占位符。

(2)循環(huán)album切片中的結(jié)構(gòu),尋找其ID 字段值與id參數(shù)值匹配的結(jié)構(gòu)。如果找到,則將該album結(jié)構(gòu)序列化為 JSON,并將其作為帶有200 OK HTTP 代碼的響應(yīng)返回。

如上所述,實際使用中的服務(wù)可能會使用數(shù)據(jù)庫查詢來執(zhí)行此查找。

(3)如果找不到專輯,則返回 HTTP 404錯誤。

b.最后,更改您的main,使其包含對router.GET的新調(diào)用,路徑現(xiàn)在為/albums/:id ,如以下示例所示。

在此代碼中:

(1)將/albums/:id路徑與getAlbumByID功能相關(guān)聯(lián)。在 Gin 中,路徑中項目前面的冒號表示該項目是路徑參數(shù)。

a.如果服務(wù)器從上一節(jié)開始仍在運行,請停止它。

b.在包含 main.go 的目錄中的命令行中,運行代碼以啟動服務(wù)器。

c.從不同的命令行窗口,用于curl向正在運行的 Web 服務(wù)發(fā)出請求。

該命令應(yīng)顯示您使用其 ID 的專輯的 JSON。如果找不到專輯,您將收到帶有錯誤消息的 JSON。

恭喜!您剛剛使用 Go 和 Gin 編寫了一個簡單的 RESTful Web 服務(wù)。

本節(jié)包含您使用本教程構(gòu)建的應(yīng)用程序的代碼。

GO語言入門,有什么好的教程?。?/h2>

可以學(xué)習(xí)黑馬程序員的這個教程

20小時快速入門go語言:網(wǎng)頁鏈接

go語言的優(yōu)勢

可直接編譯成機器碼,不依賴其他庫,glibc的版本有一定要求,部署就是扔一個文件上去就完成了。

靜態(tài)類型語言,但是有動態(tài)語言的感覺,靜態(tài)類型的語言就是可以在編譯的時候檢查出來隱藏的大多數(shù)問題,動態(tài)語言的感覺就是有很多的包可以使用,寫起來的效率很高。

語言層面支持并發(fā),這個就是Go最大的特色,天生的支持并發(fā)。Go就是基因里面支持的并發(fā),可以充分的利用多核,很容易的使用并發(fā)。

內(nèi)置runtime,支持垃圾回收,這屬于動態(tài)語言的特性之一吧,雖然目前來說GC(內(nèi)存垃圾回收機制)不算完美,但是足以應(yīng)付我們所能遇到的大多數(shù)情況,特別是Go1.1之后的GC。

簡單易學(xué),Go語言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go關(guān)鍵字是25個,但是表達(dá)能力很強大,幾乎支持大多數(shù)你在其他語言見過的特性:繼承、重載、對象等。

豐富的標(biāo)準(zhǔn)庫,Go目前已經(jīng)內(nèi)置了大量的庫,特別是網(wǎng)絡(luò)庫非常強大。

內(nèi)置強大的工具,Go語言里面內(nèi)置了很多工具鏈,最好的應(yīng)該是gofmt工具,自動化格式化代碼,能夠讓團(tuán)隊review變得如此的簡單,代碼格式一模一樣,想不一樣都很困難。

跨平臺編譯,如果你寫的Go代碼不包含cgo,那么就可以做到window系統(tǒng)編譯linux的應(yīng)用,如何做到的呢?Go引用了plan9的代碼,這就是不依賴系統(tǒng)的信息。

內(nèi)嵌C支持,Go里面也可以直接包含C代碼,利用現(xiàn)有的豐富的C庫。

一學(xué)就會,手把手教你用Go語言調(diào)用智能合約

智能合約調(diào)用是實現(xiàn)一個 DApp 的關(guān)鍵,一個完整的 DApp 包括前端、后端、智能合約及區(qū)塊 鏈系統(tǒng),智能合約的調(diào)用是連接區(qū)塊鏈與前后端的關(guān)鍵。

我們先來了解一下智能合約調(diào)用的基礎(chǔ)原理。智能合約運行在以太坊節(jié)點的 EVM 中。因此要 想調(diào)用合約必須要訪問某個節(jié)點。

以后端程序為例,后端服務(wù)若想連接節(jié)點有兩種可能,一種是雙 方在同一主機,此時后端連接節(jié)點可以采用 本地 IPC(Inter-Process Communication,進(jìn) 程間通信)機制,也可以采用 RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)機制;另 一種情況是雙方不在同一臺主機,此時只能采用 RPC 機制進(jìn)行通信。

提到 RPC, 讀者應(yīng)該對 Geth 啟動參數(shù)有點印象,Geth 啟動時可以選擇開啟 RPC 服務(wù),對應(yīng)的 默認(rèn)服務(wù)端口是 8545。。

接著,我們來了解一下智能合約運行的過程。

智能合約的運行過程是后端服務(wù)連接某節(jié)點,將 智能合約的調(diào)用(交易)發(fā)送給節(jié)點,節(jié)點在驗證了交易的合法性后進(jìn)行全網(wǎng)廣播,被礦工打包到 區(qū)塊中代表此交易得到確認(rèn),至此交易才算完成。

就像數(shù)據(jù)庫一樣,每個區(qū)塊鏈平臺都會提供主流 開發(fā)語言的 SDK(Software Development Kit,軟件開發(fā)工具包),由于 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節(jié)點、發(fā)交易,直接在工程內(nèi)導(dǎo)入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。

總結(jié)一下,智能合約被調(diào)用的兩個關(guān)鍵點是節(jié)點和 SDK。

由于 IPC 要求后端與節(jié)點必須在同一主機,所以很多時候開發(fā)者都會采用 RPC 模式。除了 RPC,以太坊也為開發(fā)者提供了 json- rpc 接口,本文就不展開討論了。

接下來介紹如何使用 Go 語言,借助 go-ethereum 源碼庫來實現(xiàn)智能合約的調(diào)用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。

步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應(yīng)用二進(jìn)制接口)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創(chuàng)建該文件,文件名可自定義,后綴最好使用 abi)。

最好能將 calldemo.abi 單獨保存在一個目錄下,輸入“l(fā)s”命令只能看到 calldemo.abi 文件,參 考效果如下:

步驟 02:獲得合約地址。注意要將合約部署到 Geth 節(jié)點。因此 Environment 選擇為 Web3 Provider。

在【Environment】選項框中選擇“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,命令如下:

在項目工程內(nèi),執(zhí)行初始化,calldemo 可以自定義名稱。

步驟 05:運行代碼。執(zhí)行代碼,將看到下面的效果,以及最終輸出的 2020。

上述輸出信息中,可以看到 Go 語言會自動下載依賴文件,這就是 go mod 的神奇之處。看到 2020,相信讀者也知道運行結(jié)果是正確的了。

『No8: Go 接口』

大家好,我是謝偉,是一名程序員。

下面的學(xué)習(xí)是一個系列,力求從初學(xué)者的角度學(xué)會go 語言,達(dá)到中級程序員水平。

這一系列是我的輸出總結(jié),同時我還推出了視頻版。正在制作過程。

為寫出這些文章,我閱讀了網(wǎng)上諸多熱門的教程和紙質(zhì)書籍。內(nèi)容的實質(zhì)都是那些,要區(qū)分出差異的話,只能表現(xiàn)在具體實例層面。所以,實例我會選取自己在工作中的項目實例抽取出來。希望對大家有所幫助。

我們已經(jīng)研究了:

本節(jié)的主題是:接口

接口是 golang 中最值得強調(diào)的特性。它讓面向?qū)ο?,?nèi)容組織實現(xiàn)非常的方便。

接口在 go 語言中是一系列方法的集合,原則上方法可以有很多個,但建議4個左右。

上文中定義了一個 httpClient 的接口,指定了這個接口可以干這些活: Get、Post、Put、Delete

上文中指定了 httpClient 接口,指定了這個接口需要干的活是: Get、Post、Put、Delete , 具體的實現(xiàn)需要靠其他結(jié)構(gòu)體來實現(xiàn)。

一個結(jié)構(gòu)體實現(xiàn)了接口要求的所有的方法(方法的參數(shù)和返回值一致),那么就說這個結(jié)構(gòu)體實現(xiàn)了這個接口

上文中的使用: httpClient 屏蔽了 httpImpl 的內(nèi)部細(xì)節(jié),而依然可以使用 Get 方法,去完成任務(wù)。

當(dāng)然接口可以被諸多結(jié)構(gòu)體實現(xiàn),只需存在接口定義的幾種方法即可。

接口和結(jié)構(gòu)體的定義很相似,也可以完成嵌入接口的功能,嵌入的匿名的接口,可以自動的具備被嵌入的接口的方法。

結(jié)構(gòu)體實現(xiàn) String 方法即可實現(xiàn)結(jié)構(gòu)化輸出結(jié)構(gòu)體。

實現(xiàn)Error 方法即可自定義錯誤類型。

這幾個讀寫接口在好些庫中實現(xiàn)了,后續(xù)我們再討論。

Any 類型

空接口在 go 里,可以當(dāng)成任意類型,意味著,比如你的函數(shù)或者方法不知道傳入的參數(shù)的類型,可以直接定義為 interface{}

類型斷言

類型斷言的使用場景是:接口類型的變量可以包含任何類型的值。如何判斷變量的真實類型?

比如解析一個不知道字段類型的 json, 常常需要使用到類型斷言。

可以使用:

ok...idiom

varInterface.(T), varInterface 必須是接口、T 則是具體的實現(xiàn)接口的結(jié)構(gòu)體

switch ..case...

.(type) 只在 switch 語句里才能使用。

以上就是接口的全部內(nèi)容,接口是go 中最特別的特性。借助 接口, go 實現(xiàn)面向?qū)ο笾械睦^承和多態(tài)。

接口是方法的集合,只定義具體要干什么,而怎么干,則由其他的結(jié)構(gòu)體的方法實現(xiàn)。這樣不同的結(jié)構(gòu)體的方法的具體處理不同,實現(xiàn)的接口的功能就不一樣。

盡管如此,接口并不意味著可以隨意濫用。我們最好是根據(jù)面向?qū)ο蟮目陀^實體,抽象出接口和方法。

本節(jié)完,再會。

Go語言設(shè)計與實現(xiàn)(上)

基本設(shè)計思路:

類型轉(zhuǎn)換、類型斷言、動態(tài)派發(fā)。iface,eface。

反射對象具有的方法:

編譯優(yōu)化:

內(nèi)部實現(xiàn):

實現(xiàn) Context 接口有以下幾個類型(空實現(xiàn)就忽略了):

互斥鎖的控制邏輯:

設(shè)計思路:

(以上為寫被讀阻塞,下面是讀被寫阻塞)

總結(jié),讀寫鎖的設(shè)計還是非常巧妙的:

設(shè)計思路:

WaitGroup 有三個暴露的函數(shù):

部件:

設(shè)計思路:

結(jié)構(gòu):

Once 只暴露了一個方法:

實現(xiàn):

三個關(guān)鍵點:

細(xì)節(jié):

讓多協(xié)程任務(wù)的開始執(zhí)行時間可控(按順序或歸一)。(Context 是控制結(jié)束時間)

設(shè)計思路: 通過一個鎖和內(nèi)置的 notifyList 隊列實現(xiàn),Wait() 會生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號通知一個(Signal())或所有(Boardcast())等待者(內(nèi)部實現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。

暴露四個函數(shù):

實現(xiàn)細(xì)節(jié):

部件:

包: golang.org/x/sync/errgroup

作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時就終止組內(nèi)各協(xié)程。

設(shè)計思路:

結(jié)構(gòu):

暴露的方法:

實現(xiàn)細(xì)節(jié):

注意問題:

包: "golang.org/x/sync/semaphore"

作用:排隊借資源(如錢,有借有還)的一種場景。此包相當(dāng)于對底層信號量的一種暴露。

設(shè)計思路:有一定數(shù)量的資源 Weight,每一個 waiter 攜帶一個 channel 和要借的數(shù)量 n。通過隊列排隊執(zhí)行借貸。

結(jié)構(gòu):

暴露方法:

細(xì)節(jié):

部件:

細(xì)節(jié):

包: "golang.org/x/sync/singleflight"

作用:防擊穿。瞬時的相同請求只調(diào)用一次,response 被所有相同請求共享。

設(shè)計思路:按請求的 key 分組(一個 *call 是一個組,用 map 映射存儲組),每個組只進(jìn)行一次訪問,組內(nèi)每個協(xié)程會獲得對應(yīng)結(jié)果的一個拷貝。

結(jié)構(gòu):

邏輯:

細(xì)節(jié):

部件:

如有錯誤,請批評指正。


標(biāo)題名稱:go語言編寫接口教程,go語言基礎(chǔ)教程
分享地址:http://weahome.cn/article/dsejcdc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部