为什么我爱Golang
我喜歡Go編程語言,或者有人稱它為Golang。 很簡單,也很棒。
我在切線上寫這個。 沒想到Golang會這么好。
我首先在2016年1月左右回去,那里有一個相對較小但熱情的社區。
當時我并沒有考慮太多,我在磨練自己的編程技能,而Golang只是我用來完成任務的工具。
甚至在一年前,使用go還是很棒的。 一旦掌握了通用語言,該過程就很簡單了。
我為Visualead (我工作的公司)編寫了關鍵代碼,但它并沒有讓我們失望,一年后仍在生產中運行,此后零維護。
最近,我發現自己再次使用Golang,不得不寫關于我愛上Golang的原因。
GOPATH環境
這是您開始使用Go編寫后必須首先處理的事情之一。
在計算機上的任何位置設置GOPATH目錄,其中包含bin,src和pkg目錄,您就可以開始編寫了。
// How the directory structure looks like: go - bin - pkg - src在我的主目錄下,我為所寫的每種編程語言創建一個新目錄。我的用戶主目錄中充滿以下文件夾:
chef cpp elixir elm go javascript meteor ocaml php python scala除了Go之外,這些語言都沒有強制執行此結構。 Go會強制您為所有Golang物品定義一個根目錄,并且這樣做的確有充分的理由。
Golang應用程序
是否要創建新的Golang應用程序? 簡單。
轉到$ GOPATH / src目錄,創建一個新文件夾,創建一個新文件。go,調用包main,添加一個func main(){}函數即可。 從那一刻開始,您就可以使用所有的Go功能。
更多關于Go的好東西即將出現! 但首先要談談Golang模塊。
Golang模塊
我最喜歡的編程范例做得很好。 我認為模塊系統是面向對象類系統的一種替代。
Golang稱其為模塊包。 因此,從現在開始,每當我們說一個模塊時,我們就意味著一個包,反之亦然。
Module == Package == Module在Golang中,您創建的每個目錄都將成為一個包。 如果包的名稱為main,則它可以成為應用程序。這有助于將代碼自然地分離為可管理的邏輯塊。
您始終希望從可重用的組件或程序包(如果使用Golang)中創建業務邏輯。
在我當前的應用程序中,我必須處理某些文件中的某些行,并在完成后將其上傳到AWS S3。
我的應用程序結構如下所示:
src - my_app - - main.go - - main_test.go - - uploader - - - uploader.go - - - uploader_test.go - - replace_file_lines - - - replace.go - - - replace_test.go - - - strings_util.go - - - strings_util_test.go_test.go文件當然是為Golang進行單元測試文件的方式,Golang具有內置的測試框架。
對于那些來自面向對象語言的人來說,也可以認為這里的每個目錄都是完整的靜態類,.go文件中的每個函數或變量都將成為屬性或方法。
這是一個replace.go可能看起來像的示例:
如果一個目錄共享多個.go文件,則所有方法和變量在整個程序包之間共享,甚至在私有程序包之間也是如此。 它有助于將包分成更小的塊,并避免大的單個文件。
在不涉及面向對象與功能/過程的情況下,重要的是要知道Go創建者決定不將經典類包括在語言中。 相反,選擇使用結構/接口和程序包。
Golang Gofmt
Golang約定了所有內容的外觀,每種情況和每行所需的確切間距。
這使開發人員可以專注于編寫代碼,而不是對花括號位置發動戰爭。
舊的{} vs {\ n}戰爭:
或者,也許我只是因為我一方在圍棋中獲勝而感到高興?在此處了解更多信息: https : //golang.org/cmd/gofmt/
Golang導入
導入始終相對于GOPATH / src。 總是。 我不能高估這個決定為我節省了多少挫敗感。
警告:下一行有意混淆。
在使用其他語言時,您可以使用相對/絕對導入,或者以某種方式設置一個怪異的導入,該導入將允許您從不知道位置的位置導入文件(我在看Python)。
Go以獨特的方式解決了問題。 所有導入,無論在哪個文件中,都始終相對于GOPATH / src
因此,在my_app的情況下,其主要導入將如下所示:
my_app在src下,因此我們需要先提及它,然后導入my_app下存在的包,例如uploader和replace_file_lines。 注意,我們不是導入單個文件,而是導入整個包。 像魅力一樣工作并引起零混亂。
此外,除非您實際使用導入的軟件包,否則Golang不會編譯,此小功能可幫助您知道實際使用了每個導入。
期望您的程序員編寫干凈的代碼而沒有未使用的導入? 您為什么不讓當地的Gopher來照顧呢?
Golang Get系統
導入部分將引導我們轉到Golang的下一個重要功能,即go get功能。 雖然其他人對JavaScripts NPM軟件包管理器印象深刻,但Go只是使用任何git存儲庫作為其軟件包管理器。
它是如何工作的?
我之前寫過我需要上傳到S3,對嗎? 那么那意味著我需要AWS開發工具包來完成該任務。
為了使這項工作有效,我只需打開終端并輸入:
go get github.com/aws/aws-sdk-go這里發生了什么? 沒什么特別的,Golang只是從https://github.com/aws/aws-sdk-go下載回購文件到您的GOPATH / src目錄中。
然后,只需使用aws-sdk即可導入它:
還記得所有導入都相對于GOPATH / src嗎? 由此可見,例如s3包現在位于GOPATH / src / github.com / aws / aws-sdk-go / services / s3下。
簡單。 優雅。 地鼠的另一顆星。
Golang構建和打包系統
到目前為止,我們一直將重點放在GOPATH / src上,但還有其他目錄需要我們處理,即GOPATH / pkg和GOPATH / bin。
Golang是一種編譯語言,這意味著必須對其進行編譯才能運行。 Golang快速編譯。 它是如何工作的?
每次編譯代碼以運行它時,Golang都會在與包相同的路徑中僅在GOPATH / pkg目錄下創建一個.a文件。 這意味著,例如,如果您編譯aws-sdk。 它將被編譯一次,并在所有其他代碼之間共享。
當然,這并不是Golang快速編譯的唯一原因,但這只是一個介紹,可以幫助您了解GOPATH / pkg的作用
現在,GOPATH / bin呢? 當您運行go install命令時,go將創建一個二進制文件,并將其放在GOPATH / bin下,在本例中,該文件將獲得主軟件包目錄my-app的名稱。
為什么這么好? 好了,您可以將GOPATH / bin添加到全局PATH變量中,并且您的構建的所有二進制文件都可以在命令行中使用,而無需執行任何額外的工作! (很棒:D嗎?)
Golang跨平臺構建
部署到其他發行版而不是編寫代碼的發行版? 好吧,不用擔心,您不需要Windows機器就可以為Windows構建代碼。 高朗讓你受夠了。
趕緊跑:
GOOS=windows GOARCH=amd64 go install并且我們的代碼將輸出一個二進制文件,準備在Windows機器上進行部署。 .exe文件將出現在GOPATH / bin / windows_amd64 / my_app.exe中。 像在公園散步。
Golang語言
Golang旨在成為一種簡單的語言。
我喜歡以下帖子,詢問為什么Go并非設計成功能語言: https : //www.quora.com/Why-wasnt-Go-writing-as-a-functional-language
“在Google工作的程序員是職業生涯的早期,并且最熟悉過程語言,尤其是C家族的語言。 需要以一種新的語言快速提高程序員的工作效率,這意味著該語言不能過于激進。”
而且很簡單。
以下是Golang不支持的一些功能:
盡管有時我發現自己在使用Go編寫語言時缺少語言功能,但我總是可以做我想做的所有事情。 只是有時它需要更多的寫作和思考。 最重要的是,它導致代碼更容易推理,因為它不那么抽象。
有時候,這使我感到驚訝,因為沒有那么多年的經驗,僅僅因為該語言是如此的融洽和清晰,我就能以多么快的速度實現目標。
Golang并發
我出于最后目的離開了并發性討論。 為什么? 因為我認為這并不重要。
這是該語言的驚人功能。 但有時它被視為Go的本質,但我認為并非如此。
因此,讓我嘗試將其總結為一個段落。
是的,Golang具有很好的并發性。 您無需處理線程,而是創建廉價的goroutine,這些例程易于制造和管理。 Goroutine允許您在所有CPU上分配負載,而不必擔心如何管理所有負載。
仍然對了解goroutines感興趣嗎? 在這里閱讀有關它們的信息: https : //tour.golang.org/concurrency/1
戈朗地鼠
來吧,他真可愛!
我是否提到我是函數式編程的狂熱者? 那為什么我對Golang如此著迷呢? 它甚至沒有關于mondas的概念。 誰知道……宇宙以神秘的方式運轉。
From: https://hackernoon.com/why-i-love-golang-90085898b4f7
總結
以上是生活随笔為你收集整理的为什么我爱Golang的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HS光流法及其代码示例
- 下一篇: 是时候聘请首席元宇宙官了吗?