Go 語言入門基礎學習筆記之 Go 語言簡介
簡介#
Go 語言,又稱為 Golang,是由 Google 開發的一種靜態強類型、編譯型的開源編程語言。它由 Robert Griesemer、Rob Pike 和 Ken Thompson 在 2007 年設計,並於 2009 年正式對外發布。Go 語言的設計目標是提高編程效率,解決多核處理器並發編程的問題,並提高代碼的可讀性和可維護性。Go 語言以其高性能、高並發和簡潔的語法,在現代軟件開發中越來越受歡迎。
優勢#
- 極其簡單的部署方式
- 可直接編譯成機器碼
- 不依賴其他庫(可執行文件較大,把全部所需的庫靜態編譯)
- 直接運行即可部署
- 靜態類型語言
- 編譯的時候檢查出來隱藏的大多數問題
- 語言層面的並發
- 天生的基因支持並發
- 充分利用多核
- 強大的標準庫
- runtime 系統調度機制
- 高效的 GC 垃圾回收機制
- 豐富的標準庫:網絡通信、數學、文件系統、數據結構、應用構建、加解密、測試、Email、輸入輸出、壓縮、同步鎖機制、進程線程等
- 簡單易學
- 25 個關鍵字
- C 語言簡潔的基因,內嵌 C 語法支持
- 面向對象特徵(繼承、多態、封裝)
- 跨平台
- “大廠” 領軍
- Google、Facebook
- 騰訊、百度、京東
- 小米、七牛、滴滴、阿里、新浪、哔哩哔哩、字節
利用斐波那契數列算法簡單看看 Go 的性能情況:
- 編譯性能:
Go > C > Node.js > PHP > C++ > Java > Python 3
- 運行性能:
C++ > C > Go > Java > Node.js > PHP > Python 3
強項#
- 雲計算基礎設施領域。代表項目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛雲存儲等。
- 基礎後端軟件。代表項目:tidb、influxdb、cockroachdb 等。
- 微服務。代表項目:go-kit、micro、monzo bank 的 typhon、bilibili 等。
- 互聯網基礎設施。代表項目:以太坊、hyperledger 等。
明星產品:Docker、Kubernetes
缺點#
- 包管理,大部分包都在 GitHub 上。
- 所有的 Exception 都用 Error 來處理(比較有争议,与 Java 完全相反)
- 對 C 的降級處理,并非無縫,沒有 C 降級到 asm 那麼完美(序列化問題,還不能取代 C)
環境安裝#
All releases - The Go Programming Language
Windows 下載 go1.23.2.windows-amd64.zip 或 go1.23.2.windows-amd64.msi ,並將其中的 bin
文件夾添加進環境變量:
在系統變量中,新建一個變量名為 GOROOT
,變量值為 Go 安裝目錄路徑。再新建一個變量名為 GOPATH
,變量值為 Go 所有項目的根目錄路徑。最後在系統變量中的 path 路徑添加 %GOROOT\bin%
。
在 Go 項目目錄中創建 bin pkg src
三個目錄,其中 src
為我們編寫項目的根文件夾,bin
和 pkg
分別存放我們安裝的第三方依賴和插件。
在終端中輸入 go version
返回版本號 go version go1.23.2 windows/amd64
,則安裝成功。
打開 VsCode 並安裝 Go 語言官方插件,打開終端並執行以下語句,方便安裝 Go 開發工具包
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
在 VsCode 中打開命令面板 Ctrl+Shift+p
,輸入 Go install
,選中 Install/Upadte Tools
,勾選全部工具並安裝,工具會安裝到我們上方設置的 GOPATH
環境變量中的 bin pkg
文件夾中。
安裝完成後,新建一個項目文件夾 test
,創建一個 main.go
文件,這時一定還要在這個文件夾中輸入 go mod init test
,test
需要與項目文件夾的名字一樣。完成後會出現一個 go.mod
,就可以編寫代碼了。
如果完成了以上所有操作,在 vscode 中編寫代碼依舊會報錯,則還需要在 VsCode 中重新設置 GOPATH
和 GOROOT
的路徑。
語言結構#
Go 語言的基礎組成有以下幾個部分:
- 包聲明
- 引入包
- 函數
- 變量
- 語句 & 表達式
- 註釋
package main
import "fmt"
func main() {
/* 這是第一個Go語言程序 */
fmt.Println("Hello, World!")
}
package main
定義了包名。你必須在源文件中非註釋的第一行指明這個文件屬於哪個包,如:package main。package main 表示一個可獨立執行的程序,每個 Go 應用程序都包含一個名為 main 的包。當前程序有 main 函數,就是 main 包。 這與當前程序文件名沒有關係。
import "fmt"
告訴 Go 編譯器這個程序需要使用 fmt 包,fmt 包實現了格式化 IO(輸入 / 輸出)的函數。導入多個包時,可使用以下兩種方式,推薦第二種。
import "fmt"
import "time"
import (
"fmt"
"time"
)
//
和 /* */
分別是單行註釋和多行註釋,這與 C 語言一致
func main()
是程序開始執行的函數。main 函數是每一個可執行程序所必須包含的,一般來說都是在啟動後第一個執行的函數(如果有 init()
函數則會先執行該函數)。每個包只能有一個 main 函數,不能存在多個 main 函數聲明
需要注意的是,Go 語言中函數後的 {
必須跟函數名同一行,否則不能報錯。同時語句結尾的 ;
可加可不加,推薦不加。
func main(){
fmt.Println("hello Go!")
fmt.Println("hello Go!");
}
fmt.Println(...)
可以將字符串輸出到控制台,並在最後自動增加換行 \n
,使用 fmt.Print(...)
效果相同。 Print
和 Println
這兩個函數也支持使用變量,如:fmt.Println(arr)
,如果沒有特別指定,它們會以默認的打印格式將變量 arr 輸出到控制台。
當標識符(包括常量、變量、類型、函數名、結構字段等等)以一個大寫字母開頭,如:Group1
,那麼使用這種形式的標識符的對象就可以被外部包的代碼所使用(客戶端程序需要先導入這個包),這被稱為導出(像面向對象語言中的 public);
當標識符以小寫字母開頭,則對包外是不可見的,但是他們在整個包的內部是可見並且可用的(像面向對象語言中的 protected )。
Go 語言的執行有兩種方式:
go run hello.go
直接編譯程序並執行go build hello.go
編譯成二進制文件後,./hello.go
執行二進制文件
參考課程:8 小時轉職 Golang 工程師