Golang 的創(chuàng)建是為了實現(xiàn)最大的用戶效率和編碼效率。已經(jīng)熟悉 Java 或 PHP 的程序員可以在幾周內(nèi)接受 Go 的培訓(許多人最終會更喜歡它)。在本文中,Dewet Diener 探討了 Golang 的優(yōu)缺點,以及它的測試驅(qū)動開發(fā) (TDD) 如何完美契合。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設,畢節(jié)企業(yè)網(wǎng)站建設,畢節(jié)品牌網(wǎng)站建設,網(wǎng)站定制,畢節(jié)網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,畢節(jié)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
Golang 由 Google 開發(fā)和設計,于 2009 年作為一種綜合性編程語言首次出現(xiàn),旨在最大限度地提高編碼效率。創(chuàng)建該語言的目的是修正其他已建立語言的缺陷。盡管 Golang(或簡稱為“Go”)是一門年輕的語言,但已經(jīng)積累了大量的開發(fā)人員,因此我們想分享為什么在 Curve 我們喜歡 Golang,以及我們?nèi)绾尾捎盟鼇韺崿F(xiàn)我們移動銀行業(yè)務的目標到云端。
Go 是一種精致的編程語言:它支持“所見即所得”的原則,這意味著清晰易讀的代碼和更少的復雜抽象。該語言本身易于使用且易于訓練。盡管如此,作為一個相對較新的生態(tài)系統(tǒng),要找到對 Go 具有廣泛預先知識的工程師可能會很棘手。
然而,與其他編程語言不同,Go 的創(chuàng)建是為了最大限度地提高用戶效率。因此,具有 Java 或 PHP 背景的開發(fā)人員和工程師可以在幾周內(nèi)獲得使用 Go 的技能和培訓——根據(jù)我們的經(jīng)驗,他們中的許多人最終更喜歡它。
在 Curve,我們大力提倡測試驅(qū)動開發(fā) (TDD),Go 的框架與這種方法保持一致。通過簡單地命名一個文件 foo_test.go 并在該文件中添加結構化測試函數(shù),Go 將快速有效地運行您的單元測試。這一創(chuàng)新功能提高了生產(chǎn)力,因為它可以更加專注于測試驅(qū)動的開發(fā)和改進的同行評審機會。
Golang 具有出色的生產(chǎn)優(yōu)化品質(zhì),例如內(nèi)存占用小,這支持其在大型項目中作為構建塊的能力,以及開箱即用的與其他架構的輕松交叉編譯。由于 Go 代碼被編譯為單個靜態(tài)二進制文件,因此它可以輕松進行容器化,并且通過擴展,將 Go 部署到任何高可用性環(huán)境(例如 Kubernetes)中幾乎是微不足道的。
它提供了一種機制來保護工作負載,通過擁有非常纖薄的生產(chǎn)容器而沒有任何無關的依賴項。這使得構建、部署和維護基于 Go 的資產(chǎn)更加直接和安全,并為希望建立或發(fā)展其微服務戰(zhàn)略的公司提供了可靠的選擇。
Go 是專門為滿足我們快速發(fā)展的技術生態(tài)系統(tǒng)的需求而創(chuàng)建的。例如,Go 可以滿足您構建 API 所需的一切,并將其作為其標準庫的一部分。它使用簡單,高性能的 http 服務器消除了團隊設計新項目時經(jīng)常發(fā)生的一些常見的 探索 和設計癱瘓問題——這對于一些其他流行語言(如 Java 和 Node.js)來說太常見了。
Golang 還通過其內(nèi)置于語言本身的自動格式化程序巧妙地解決了代碼格式化分歧。這完全消除了格式爭議,進而提高了團隊的生產(chǎn)力和注意力。
盡管我是 Go 的擁護者,但它顯然也不是沒有缺陷。一個爭論不休的特性是 Go 沒有顯式接口,這是許多開發(fā)人員習慣的概念。雖然不是有害的,但它可以使選擇最適合您的結構的接口成為一項任務。這是因為您不會像在其他流行的編程語言中那樣編寫 X 實現(xiàn) Y,但您很快就會接受。
依賴管理也是另一個不屬于 Google Golang 開發(fā)團隊原始設計的功能。開源社區(qū)介入并創(chuàng)建了 Glide 和 Dep,最初的努力并沒有完全解決問題。從 Go 1.11 開始,添加了對模塊的支持,這似乎已成為官方的依賴管理工具。這些挑戰(zhàn)并沒有削弱 Go 作為一種高效編程語言的獨創(chuàng)性,并且它繼續(xù)為我們提供優(yōu)于其他編程語言的顯著優(yōu)勢。
Golang 吸引了全球敏銳的開發(fā)人員的注意,并且圍繞它的興奮繼續(xù)增長。開源社區(qū)因有趣的項目而蓬勃發(fā)展;最著名的是 Docker 和 Kubernetes。
正是這種新鮮、有創(chuàng)意但又簡單的包裝吸引了我們?nèi)o:它是一種令人興奮的編碼語言,可以幫助我們在 Curve 中快速開發(fā)以構建更好的產(chǎn)品。
1. 部署簡單
Go
編譯生成的是一個靜態(tài)可執(zhí)行文件,除了glibc外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應用所需的各種包、庫的依賴關系,大大減輕了維護的負擔。
2. 并發(fā)性好
Goroutine和channel使得編寫高并發(fā)的服務端軟件變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個Go應用也能有效的利用多個CPU核,并行執(zhí)行的性能好。
3. 良好的語言設計
從學術的角度講Go語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go的設計是非常優(yōu)秀的:規(guī)范足夠簡單靈活,有其他語言基礎的程序員都能迅速上手。更重要的是
Go 自帶完善的工具鏈,大大提高了團隊協(xié)作的一致性。
4. 執(zhí)行性能好
雖然不如 C 和 Java,但相比于其他編程語言,其執(zhí)行性能還是很好的,適合編寫一些瓶頸業(yè)務,內(nèi)存占用也非常省。
這個文件通過路徑標識 rsc.io/hello 定義了一個模塊,它本身還依賴于兩個其他模塊:golang.org/x/text 和 rsc.io/quote ,這個模塊自身編譯的時候使用的是 go.mod 文件中指定的依賴列表的版本。對于更上一層的編譯,其他導入這個模塊的地方將使用它較新的版本編譯。
包發(fā)布者最好使用語義化的 tag 發(fā)布版本,vgo 也鼓勵通過打tag的版本號方式,而不是任意的提交版本。
當您的代碼使用外部包時,這些包(作為模塊分發(fā))成為依賴項。隨著時間的推移,您可能需要升級或更換它們。Go 提供了依賴管理工具,可幫助您在合并外部依賴項時確保 Go 應用程序的安全。
本主題介紹如何執(zhí)行任務以管理您在代碼中承擔的依賴項。您可以使用 Go 工具執(zhí)行其中的大部分操作。本主題還介紹了如何執(zhí)行其他一些您可能會覺得有用的依賴相關任務。
您可以通過 Go 工具獲取和使用有用的包。在 pkg.go.dev 上,您可以搜索您可能覺得有用的包,然后使用go命令將這些包導入您自己的代碼中以調(diào)用它們的功能。
下面列出了最常見的依賴項管理步驟。
在 Go 中,您將依賴項作為包含您導入的包的模塊來管理。此過程由以下機構支持:
您可以搜索pkg.go.dev以查找具有您可能覺得有用的功能的軟件包。
找到要在代碼中使用的包后,在頁面頂部找到包路徑,然后單擊復制路徑按鈕將路徑復制到剪貼板。在您自己的代碼中,將路徑粘貼到導入語句中,如下例所示:
在您的代碼導入包后,啟用依賴項跟蹤并獲取包的代碼進行編譯。
要跟蹤和管理您添加的依賴項,您首先要將代碼放入其自己的模塊中。這會在源代碼樹的根目錄創(chuàng)建一個 go.mod 文件。您添加的依賴項將列在該文件中。
要將您的代碼添加到它自己的模塊中,請使用 go mod init命令。例如,從命令行切換到代碼的根目錄,然后按照以下示例運行命令:
該go mod init命令的參數(shù)是您的模塊的模塊路徑。如果可能,模塊路徑應該是源代碼的存儲庫位置。
如果一開始您不知道模塊的最終存儲庫位置,請使用安全的替代品。這可能是您擁有的域的名稱或您控制的另一個名稱(例如您的公司名稱),以及來自模塊名稱或源目錄的路徑。
當您使用 Go 工具管理依賴項時,這些工具會更新 go.mod 文件,以便它維護您的依賴項的當前列表。
添加依賴項時,Go 工具還會創(chuàng)建一個 go.sum 文件,其中包含您所依賴的模塊的校驗和。Go 使用它來驗證下載的模塊文件的完整性,特別是對于在您的項目上工作的其他開發(fā)人員。
在代碼中包含存儲庫中的 go.mod 和 go.sum 文件。
當您運行go mod init創(chuàng)建用于跟蹤依賴項的模塊時,您指定一個模塊路徑作為模塊的名稱。模塊路徑成為模塊中包的導入路徑前綴。一定要指定一個不會與其他模塊的模塊路徑?jīng)_突的模塊路徑。
至少,一個模塊路徑只需要表明它的來源,例如公司或作者或所有者名稱。但是路徑也可能更能描述模塊是什么或做什么。
模塊路徑通常采用以下形式:
1、Go 工具可以在其中找到模塊源代碼的存儲庫的位置。
例如,它可能是github.com/ /.
如果您認為您可能會發(fā)布模塊供其他人使用,請使用此最佳實踐。
2、一個你控制的名字。
如果您不使用存儲庫名稱,請務必選擇一個您確信不會被其他人使用的前綴。一個不錯的選擇是您公司的名稱。避免使用常用術語,例如widgets、utilities或 app。
Go 保證以下字符串不會在包名稱中使用。
1、test– 您可以將test用作模塊路徑前綴以便代碼用于在另一個模塊中本地測試功能進行測試。
使用test作為模塊路徑前綴是測試的一部分。例如,您的測試本身可能會運行go mod init test,然后以某種特定方式設置該模塊,以便使用 Go 源代碼分析工具進行測試。
2、example– 在某些 Go 文檔中用作模塊路徑前綴,例如在創(chuàng)建模塊以跟蹤依賴關系的教程中。
請注意,Go 文檔還用于example.com說明示例何時可能是已發(fā)布的模塊。
本教程介紹了使用 Godatabase/sql及其標準庫中的包訪問關系數(shù)據(jù)庫的基礎知識。
您將使用的database/sql包包括用于連接數(shù)據(jù)庫、執(zhí)行事務、取消正在進行的操作等的類型和函數(shù)。
在本教程中,您將創(chuàng)建一個數(shù)據(jù)庫,然后編寫代碼來訪問該數(shù)據(jù)庫。您的示例項目將是有關老式爵士樂唱片的數(shù)據(jù)存儲庫。
首先,為您要編寫的代碼創(chuàng)建一個文件夾。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個名為 data-access 的目錄。
3、創(chuàng)建一個模塊,您可以在其中管理將在本教程中添加的依賴項。
運行go mod init命令,為其提供新代碼的模塊路徑。
此命令創(chuàng)建一個 go.mod 文件,您添加的依賴項將在其中列出以供跟蹤。
注意: 在實際開發(fā)中,您會指定一個更符合您自己需求的模塊路徑。有關更多信息,請參閱一下文章。
GO語言(二十五):管理依賴項(上)
GO語言(二十六):管理依賴項(中)
GO語言(二十七):管理依賴項(下)
接下來,您將創(chuàng)建一個數(shù)據(jù)庫。
在此步驟中,您將創(chuàng)建要使用的數(shù)據(jù)庫。您將使用 DBMS 本身的 CLI 創(chuàng)建數(shù)據(jù)庫和表,以及添加數(shù)據(jù)。
您將創(chuàng)建一個數(shù)據(jù)庫,其中包含有關黑膠唱片上的老式爵士樂錄音的數(shù)據(jù)。
這里的代碼使用MySQL CLI,但大多數(shù) DBMS 都有自己的 CLI,具有類似的功能。
1、打開一個新的命令提示符。
在命令行,登錄到您的 DBMS,如下面的 MySQL 示例所示。
2、在mysql命令提示符下,創(chuàng)建一個數(shù)據(jù)庫。
3、切到您剛剛創(chuàng)建的數(shù)據(jù)庫,以便您可以添加表。
4、在文本編輯器的 data-access 文件夾中,創(chuàng)建一個名為 create-tables.sql 的文件來保存用于添加表的 SQL 腳本。
將以下 SQL 代碼粘貼到文件中,然后保存文件。
在此 SQL 代碼中:
(1)刪除名為album表。 首先執(zhí)行此命令可以讓您更輕松地稍后重新運行腳本。
(2)創(chuàng)建一個album包含四列的表:title、artist和price。每行的id值由 DBMS 自動創(chuàng)建。
(3)添加帶有值的四行。
5、在mysql命令提示符下,運行您剛剛創(chuàng)建的腳本。
您將使用以下形式的source命令:
6、在 DBMS 命令提示符處,使用SELECT語句來驗證您是否已成功創(chuàng)建包含數(shù)據(jù)的表。
接下來,您將編寫一些 Go 代碼進行連接,以便進行查詢。
現(xiàn)在你已經(jīng)有了一個包含一些數(shù)據(jù)的數(shù)據(jù)庫,開始你的 Go 代碼。
找到并導入一個數(shù)據(jù)庫驅(qū)動程序,該驅(qū)動程序會將您通過database/sql包中的函數(shù)發(fā)出的請求轉換為數(shù)據(jù)庫可以理解的請求。
1、在您的瀏覽器中,訪問SQLDrivers wiki 頁面以識別您可以使用的驅(qū)動程序。
2、使用頁面上的列表來識別您將使用的驅(qū)動程序。為了在本教程中訪問 MySQL,您將使用 Go-MySQL-Driver。
3、請注意驅(qū)動程序的包名稱 - 此處為github.com/go-sql-driver/mysql.
4、使用您的文本編輯器,創(chuàng)建一個用于編寫 Go 代碼的文件,并將該文件作為 main.go 保存在您之前創(chuàng)建的數(shù)據(jù)訪問目錄中。
5、進入main.go,粘貼以下代碼導入驅(qū)動包。
在此代碼中:
(1)將您的代碼添加到main包中,以便您可以獨立執(zhí)行它。
(2)導入 MySQL 驅(qū)動程序github.com/go-sql-driver/mysql。
導入驅(qū)動程序后,您將開始編寫代碼以訪問數(shù)據(jù)庫。
現(xiàn)在編寫一些 Go 代碼,讓您使用數(shù)據(jù)庫句柄訪問數(shù)據(jù)庫。
您將使用指向結構的指針sql.DB,它表示對特定數(shù)據(jù)庫的訪問。
編寫代碼
1、進入 main.go,在import您剛剛添加的代碼下方,粘貼以下 Go 代碼以創(chuàng)建數(shù)據(jù)庫句柄。
在此代碼中:
(3)使用 MySQL 驅(qū)動程序Config和FormatDSN類型以收集連接屬性并將它們格式化為連接字符串的 DSN。
該Config結構使代碼比連接字符串更容易閱讀。
(4)調(diào)用sql.Open 初始化db變量,傳遞 FormatDSN。
(5)檢查來自 的錯誤sql.Open。例如,如果您的數(shù)據(jù)庫連接細節(jié)格式不正確,它可能會失敗。
為了簡化代碼,您調(diào)用log.Fatal結束執(zhí)行并將錯誤打印到控制臺。在生產(chǎn)代碼中,您會希望以更優(yōu)雅的方式處理錯誤。
(6)調(diào)用DB.Ping以確認連接到數(shù)據(jù)庫有效。在運行時, sql.Open可能不會立即連接,具體取決于驅(qū)動程序。您在Ping此處使用以確認 database/sql包可以在需要時連接。
(7)檢查來自Ping的錯誤,以防連接失敗。
(8)Ping如果連接成功,則打印一條消息。
文件的頂部現(xiàn)在應該如下所示:
3、保存 main.go。
1、開始跟蹤 MySQL 驅(qū)動程序模塊作為依賴項。
使用go get 添加 github.com/go-sql-driver/mysql 模塊作為您自己模塊的依賴項。使用點參數(shù)表示“獲取當前目錄中代碼的依賴項”。
2、在命令提示符下,設置Go 程序使用的DBUSER和DBPASS環(huán)境變量。
在 Linux 或 Mac 上:
在 Windows 上:
3、在包含 main.go 的目錄中的命令行中,通過鍵入go run來運行代碼。
連接成功了!
接下來,您將查詢一些數(shù)據(jù)。
當您對外部模塊的存儲庫進行了 fork (例如修復模塊代碼中的問題或添加功能)時,您可以讓 Go 工具將您的 fork 用于模塊的源代碼。這對于測試您自己的代碼的更改很有用。
為此,您可以使用go.mod 文件中的replace指令將外部模塊的原始模塊路徑替換為存儲庫中 fork 的路徑。這指示 Go 工具在編譯時使用替換路徑(fork 的位置),例如,同時允許您保留import 原始模塊路徑中的語句不變。
在以下 go.mod 文件示例中,當前模塊需要外部模塊example.com/theirmodule。然后該replace指令將原始模塊路徑替換為example.com/myfork/theirmodule模塊自己的存儲庫的分支。
設置require/replace對時,使用 Go 工具命令確保文件描述的需求保持一致。使用go list命令獲取當前模塊正在使用的版本。然后使用go mod edit命令將需要的模塊替換為fork:
注意: 當您使用該replace指令時,Go 工具不會像添加依賴項中所述對外部模塊進行身份驗證。
您可以使用go get命令從其存儲庫中的特定提交為模塊添加未發(fā)布的代碼。
為此,您使用go get命令,用符號@指定您想要的代碼 。當您使用go get時,該命令將向您的 go.mod 文件添加一個 需要外部模塊的require指令,使用基于有關提交的詳細信息的偽版本號。
以下示例提供了一些說明。這些基于源位于 git 存儲庫中的模塊。
當您的代碼不再使用模塊中的任何包時,您可以停止將該模塊作為依賴項進行跟蹤。
要停止跟蹤所有未使用的模塊,請運行go mod tidy 命令。此命令還可能添加在模塊中構建包所需的缺失依賴項。
要刪除特定依賴項,請使用go get,指定模塊的模塊路徑并附加 @none,如下例所示:
go get命令還將降級或刪除依賴于已刪除模塊的其他依賴項。
當您使用 Go 工具處理模塊時,這些工具默認從 proxy.golang.org(一個公共的 Google 運行的模塊鏡像)或直接從模塊的存儲庫下載模塊。您可以指定 Go 工具應該使用另一個代理服務器來下載和驗證模塊。
如果您(或您的團隊)已經(jīng)設置或選擇了您想要使用的不同模塊代理服務器,您可能想要這樣做。例如,有些人設置了模塊代理服務器,以便更好地控制依賴項的使用方式。
要為 Go 工具指定另一個模塊代理服務器,請將GOPROXY 環(huán)境變量設置為一個或多個服務器的 URL。Go 工具將按照您指定的順序嘗試每個 URL。默認情況下,GOPROXY首先指定一個公共的 Google 運行模塊代理,然后從模塊的存儲庫直接下載(在其模塊路徑中指定):
您可以將變量設置為其他模塊代理服務器的 URL,用逗號或管道分隔 URL。
Go 模塊經(jīng)常在公共互聯(lián)網(wǎng)上不可用的版本控制服務器和模塊代理上開發(fā)和分發(fā)。您可以設置 GOPRIVATE環(huán)境變量。您可以設置GOPRIVATE環(huán)境變量來配置go命令以從私有源下載和構建模塊。然后 go 命令可以從私有源下載和構建模塊。
GOPRIVATE或環(huán)境變量可以設置為匹配模塊前綴的全局模式列表,這些GONOPROXY前綴是私有的,不應從任何代理請求。例如: