Go語言中的運算子

迄今為止,在我們的代碼示例中已經使用了一些運算子,例如=,:=和<。 讓我們更深入地探討一下它們。 我們有賦值運算子=和:=,用於聲明和初始化變量: var a = 1 b := 1 我們有比較運算子==和!=,它們接受兩個參數並返回一個布爾值: var num = 1 num == 1 //true num != 1 //false 還有<,<=,>和>=: var num = 1 num > 1 //false num >= 1 //true num < 1 //false num <= 1 //true 我們有二元(需要兩個參數)算術運算子,如+,-,*,/,%。 1 + 1 //2 1 - 1 //0 1 * 2 //2 2 / 2 //1 2 % 2 //0 +也可以用於連接字符串: "a" + "b" //"ab" 我們有一元遞增、遞減運算子++和--:...

Go資料結構:集合

分析和實現Go語言中的集合資料結構 集合是一組值的集合。您可以對這些值進行迭代,添加新值,刪除值並清除集合,獲取集合大小,以及檢查集合是否包含某個項目。集合中的值可能只會被存儲一次,不允許重複。 第一個實現 這是一個簡單的集合實現,尚未具備並發安全性,為了簡潔和易於理解,並沒有鎖定資源。稍後在本文中將添加鎖定。 請注意第二行,它允許我們通過生成此通用資料結構的特定實現來使用任何類型的集合。 set.go // 包set為Item類型創建ItemSet資料結構 package set import "github.com/cheekybits/genny/generic" // Item 集合的類型 type Item generic.Type // ItemSet 集合項目的集合 type ItemSet struct { items map[Item]bool } // Add 向集合中添加新元素。返回集合的指針。 func (s *ItemSet) Add(t Item) *ItemSet { if s.items == nil { s.items = make(map[Item]bool) } _, ok := s.items[t] if !ok { s.items[t] = true } return s } // Clear 從集合中刪除所有元素 func (s *ItemSet) Clear() { s.items = make(map[Item]bool) } // Delete 從集合中刪除項目並返回有無(項目) func (s *ItemSet) Delete(item Item) bool { _, ok := s....

使用 Go 可視化您的本地 Git 貢獻

使用 Go 撰寫 Git 統計分析 CLI 工具的教程 幾年前,我使用 Electron + Meteor.js + gitlog 桌面應用程式掃描了我的本地 Git 存儲庫,並為我提供了一個漂亮的貢獻圖,就像 GitHub.com 上顯示的那樣: 那是在每個應用程序都使用 Electron 之前,由於生成的應用程序大小,我非常不喜歡這種方法,如果與基於 WebKit 的 MacGap 相比較,它的大小要大 50 倍。不管怎樣,它看起來像這樣,具有類似 GitHub 的用戶界面: 我發現它很有用,因為不是所有的項目都在 GitHub 上,一些項目位於 BitBucket 或 GitLab 上,但我所工作的所有代碼都在我的筆記本電腦上,所以這便是“事實的單一來源”。 該應用程序仍在運行,但尚未釋放給大眾使用。 今天我決定將其作為 Go 控制台命令進行移植,因為我仍認為這個概念很好。 本文中要建立的內容 🎉 一個類似下圖的CLI命令,生成類似的圖表 在哪裡可以找到這段程式碼 該程式碼在此 Gist 鏈接上: https://gist.github.com/flaviocopes/bf2f982ee8f2ae3f455b06c7b2b03695 首先的步驟 我將任務分為兩部分: 1.獲取要掃描的文件夾列表 2.生成統計信息 我將使用 Go 命令行標記解析 來讓一個單一命令執行這兩個任務。當傳遞 -add 標記時,該命令將添加新的文件夾到列表中。在沒有標記的情況下執行該命令將生成圖表。為了避免一次性為用戶輸出過多數據,我將限制數據集的時間範圍在過去的 6 個月內。 讓我們為此分層概念撰寫一個簡單的外殼: package main import ( "flag" ) // scan given a path crawls it and its subfolders // searching for Git repositories func scan(path string) { print("scan") } // stats generates a nice graph of your Git contributions func stats(email string) { print("stats") } func main() { var folder string var email string flag....

使用 VS Code 和 Delve 调试 Go

我最喜欢的代码编辑器是来自微软的 VS Code。在过去的20年里,我使用过许多编辑器,但这是迄今为止最好的。 VS Code 是开源的,即使在我的不太新的 MacBook Pro 上也很快,它从不在进行中崩溃,它可以自定义扩展,但开箱即用效果也很好。 这一切都很棒,但是如何调试 Go 程序呢?你可能认为需要一个笨重的 IDE,但事实并非如此。通过 Delve,由 Derek Parker 开发的工具,调试 Go 程序非常简单。 首先,当然,你需要安装官方的 Go VS Code 扩展,并且确保已配置好 $GOPATH。 安装完成后,在 Linux/Windows 上,你只需要执行命令 Go: Install/Update Tools。在 Mac 上,你需要通过 Brew 下载 Delve,只需要在你喜欢的 Shell(应该是 zsh)中键入 brew install go-delve/delve/delve - 文档中提到了自签名,但 Brew 会替你处理这个问题。 完成后,设置调试器配置。 点击 VS Code 的 调试菜单,点击“开始调试”,或者按下 F5 键。 VS Code 将调试信息放在工作区根目录下的 .vscode/launch.json 文件中。这个文件将会自动生成,并且应该能够直接用于本地调试: { "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", "request": "launch", "mode": "debug", "remotePath": "", "port": 2345, "host": "127....

使用Go進行CPU和內存監控:入門指南

Go語言生態系統提供了一種非常簡便的方法來對應用程序進行監控。 本文將介紹一個由Dave Cheney提供的包,通過在main()函數中添加一行代碼,可以非常容易地對程序進行調試。 開始你的Go CPU監控 步驟 1:下載github.com/pkg/profile 運行以下命令: go get github.com/pkg/profile 步驟 2:將監控功能添加到main()函數中 在你的代碼中加入以下的import語句: package main import ( //... "github.com/pkg/profile" ) func main() { // 預設啟動CPU監控 defer profile.Start().Stop() //... } 步驟 3:編譯並運行你的程序 這將在臨時文件夾中生成一個*.pprof文件,並告訴你它的位置(稍後會需要): 2017/08/03 14:26:28 profile: cpu profiling enabled, /var/...../cpu.pprof 步驟 4:如果尚未安裝graphviz,請先安裝該軟件 它用於生成pdf格式的圖形。在Mac上只需運行brew install graphviz命令。其他平台的安裝方法請參考https://www.graphviz.org。 步驟 5:運行go tool pprof 使用你的二進制文件位置和cpu.pprof文件的位置作為參數運行以下命令即可。你可以生成不同格式的分析報告,其中PDF格式的報告效果非常好: go tool pprof --pdf ~/go/bin/yourbinary /var/path/to/cpu.pprof > file.pdf 你還可以生成其他類型的可視化報告,例如txt報告: go tool pprof --txt ~/go/bin/yourbinary /var/path/to/cpu.pprof > file.txt 內存監控 內存監控與CPU監控基本相同,只需要在profile.Start()的默認配置上傳遞profile.MemProfile標誌即可: defer profile....

在 Go 中的方法

在 Go 中,一個函數可以被賦值給結構體,這種情況下我們稱之為方法。 舉個例子: type Person struct { Name string Age int } func (p Person) Speak() { fmt.Println("Hello from " + p.Name) } func main() { flavio := Person{Age: 39, Name: "Flavio"} flavio.Speak() } 方法可以聲明為指針接收者或值接收者。 上面的例子展示了一個值接收者,它接收結構體實例的副本。 下面是一個指針接收者,它接收結構體實例的指針: func (p *Person) Speak() { fmt.Println("Hello from " + p.Name) }

在 Go 中的條件語句

我們使用 if 陳述式來根據條件執行不同的指令: if age < 18 { // 未成年 } else 部分是可選的: if age < 18 { // 未成年 } else { // 成年 } 並且可以與其他的 if 陳述式結合使用: if age < 12 { // 兒童 } else if age < 18 { // 青少年 } else { // 成年人 } 如果你在 if 內部定義任何變數,它只在 if 內部可見(同樣適用於 else 以及在任何使用 {} 開啟新區塊的地方) 如果你將有許多不同的 if 陳述式來檢查單個條件,最好使用 switch: switch age { case 0: fmt.Println("零歲") case 1: fmt....

如何創建你的第一個Go程式

在Go程式語言介紹之後,我們準備好創建我們的第一個Go程式了! 在程式設計師的傳統中,第一個程式會在執行時將「Hello, World!」字串列印到終端機上。因此,我們將首先執行這個動作,然後解釋如何實現它。 也許你的家目錄中有一個資料夾,用於存放所有的程式設計專案和測試。 在該資料夾中創建一個新的資料夾,例如命名為 hello。 在 hello 資料夾中創建一個 hello.go 檔案(檔名可以任意命名)。 將以下內容添加到檔案中: package main import "fmt" func main() { fmt.Println("Hello, World!") } 這是你的第一個Go程式! 讓我們逐行分析這個程式: package main 我們將Go程式組織成封包(package)。 每個 .go 檔案首先聲明它屬於哪個封包。 一個封包可以由多個檔案組成,也可以只有一個檔案。 一個程式可以包含多個封包。 main 封包是程式的入口點,用於識別一個可執行程式。 import "fmt" 我們使用 import 關鍵字來引入一個封包。 fmt 是Go語言提供的內建封包,提供了輸入輸出的實用函數。 我們擁有一個豐富的標準函式庫可供使用,可以用於各種功能,如網路連接、數學、加密、影像處理、檔案系統存取等等。 你可以在官方文件中閱讀這個 fmt 封包所提供的所有功能。 func main() { } 在這裡,我們聲明了 main() 函數。 什麼是函數?我們稍後會更詳細地介紹,暫時可以這樣說,函數是一塊被賦予名稱並包含一些指令的程式碼區塊。 main 函數是特殊的,因為程式的執行從這裡開始。 在這個簡單的情況下,我們只有一個函數,程式從這裡開始執行,然後結束。 fmt.Println("Hello, World!") 這是我們定義的函數的內容。 我們呼叫了之前引入的 fmt 封包中定義的 Println() 函數,並將一個字串作為參數傳遞給它。 根據官方文件的說明,這個函數「根據格式指定符進行格式化並將結果寫入標準輸出」。 請查看文檔,因為它們非常棒。它們甚至還有可以執行的示例: 我們使用「點」語法 fmt.Println() 來指定該函數是由該封包提供的。 程式執行完 main 函數後,就沒有其他事情可做,執行結束。

如何編譯和運行 Go 程式

本教程延續我們在《如何建立你的第一個 Go 程式》中所做的內容。 在 hello 資料夾中打開終端機並使用以下命令運行程式: go run hello.go 我們的程式成功運行並在終端機上輸出了「Hello, World!」。 go run 工具首先編譯程式,然後運行指定的程式。 你可以使用 go build 建立一個可執行的二進制檔案: go build hello.go 這將建立一個 hello 檔案,這是一個可執行的二進制檔案: 在前言中我提到過,Go 是可攜的。 現在你可以分發這個二進制檔案,每個人都可以直接執行,因為這個二進制檔案已經打包好了,可供執行。 程式將在與建立時相同的架構上運行。 我們可以使用 GOOS 和 GOARCH 環境變數為不同的架構創建不同的二進制檔案,如下所示: GOOS=windows GOARCH=amd64 go build hello.go 這將為 64 位元的 Windows 機器創建一個 hello.exe 執行檔: 64 位元 macOS(Intel 或 Apple Silicon)的設定為 GOOS=darwin GOARCH=amd64,而 Linux 的設定為 GOOS=linux GOARCH=amd64。 這是 Go 的最佳特點之一。

完整指南:Go 資料結構

本週,我在這個部落格的各種文章中,發布了使用 Go 實作經典資料結構的分析和實現。 每個資料結構都在單獨的文章中進行描述,而這篇文章則作為索引。 已涵蓋的資料結構,按字母順序排列如下: 二元搜尋樹 字典 圖 哈希表 鏈結串列 佇列 集合 堆疊