文章目錄
- 從0開始學習Go
- 0 與C++對比
- 1 代碼框架
- 1.1 helloworld式代碼示例
- 1.2 主體代碼元素(核心三部分)
- 1.3 其他
- 2 與C/C++區別
- 3 有用的小工具
- 4 注意事項
從0開始學習Go
0 與C++對比
特性 | C++ | Go |
---|---|---|
編譯型語言 | 需要編譯為機器碼 | 直接編譯為二進制可執行文件 |
靜態類型 | 類型在編譯時確定 | 類型系統更嚴格,支持類型推斷 |
指針操作 | 支持指針(包括多級指針) | 支持指針(但無指針運算) |
控制結構 | if/else for switch 相同 | 語法更簡潔(省略括號) |
函數多返回值 | 需通過引用參數或結構體返回 | 原生支持多返回值 |
領域 | C++ 特性 | Go 特性 |
---|---|---|
內存管理 | 手動管理(new/delete) | 自動垃圾回收(GC) |
并發模型 | 基于線程(std::thread)和鎖 | 原生協程(goroutine)和通道(channel) |
面向對象 | 類繼承、多態、運算符重載 | 通過接口(interface)和組合實現多態 |
錯誤處理 | 異常機制(try/catch) | 顯式錯誤返回(多返回值模式) |
包管理 | 頭文件包含(#include) | 模塊化設計(go.mod 依賴管理) |
泛型 | 模板(template) | 1.18+ 支持泛型(語法更簡單) |
編譯速度 | 較慢(尤其大型項目) | 極快(依賴分析高效) |
1 代碼框架
1.1 helloworld式代碼示例
package mainimport "fmt"func main() {fmt.Println("Hello, world!")
}
1.2 主體代碼元素(核心三部分)
- package
- 包,表示一組代碼。每個go文件都以package開頭
- import
- 導入其他包
- func
- 即function,由一行或多行代碼組成的組,可被其他程序調用。
- go程序運行時會尋找main,并首先運行
1.3 其他
-
并發編程
- 關鍵模式轉換:
// 傳統線程 → Go協程 go func() { // 啟動一個協程// 并發任務 }()// 共享內存 → 通道通信 ch := make(chan int) go func() { ch <- 42 }() value := <-ch
- 關鍵模式轉換:
-
接口與組合
- 面向對象思維轉換:
type Writer interface {Write([]byte) (int, error) }type FileWriter struct { /* 字段 */ } func (fw FileWriter) Write(data []byte) (int, error) {// 實現接口 }
- 面向對象思維轉換:
2 與C/C++區別
- 不以分號結尾,但可以用來分隔語句(不推薦)
3 有用的小工具
-
go fmt
go自帶格式化工具,不需要像c++一樣借助clang等工具 -
go test
go test -bench . # 基準測試 -
go tool
go tool pprof # 性能剖析 -
依賴管理
- 創建模塊:
go mod init your-project go get github.com/gin-gonic/gin@v1.7.7
- 創建模塊:
4 注意事項
- 需避免的常見陷阱
-
過度設計
- ? 用 C++ 的類層次結構設計 Go 程序
- ? 使用小而精的接口 + 組合
-
并發誤用
- ? 直接共享內存(sync.Mutex 不是首選方案)
- ? 優先使用通道通信
-
錯誤處理
- ? 忽略錯誤返回值
- ? 始終檢查錯誤:
if result, err := someFunc(); err != nil {// 處理錯誤 }
-