使用 retry-go 制定再試策略

現在寫程式常常都會有大量的 API 溝通,現實世界常會遇到像是網路不穩定等等的情況,這時有再試策略 (retry strategy) 就很重要了。 retry-go 是一個可以讓我們自定再試策略 (retry strategy)...

23 March 2024 · 3 min · nyo

使用 gomock 寫測試

gomock 原本是 golang 官方維護的套件,不過因為有一段時間沒有在維護了,在 2023 年 6 月時就改由 uber 團隊接手維護了。 停止維護: https://github.com/golang/mock 目前有在維護: https://github.com/uber-go/mock 安裝工具 安裝 mockgen 工具...

31 December 2023 · 2 min · nyo

使用 Cobra 製作有多層指令的應用程式 (Nested Subcommands)

Cobra 是一個很方便 cli 函式庫,有許多的 project 都是用他來寫 cli 應用程式,我自己也是很常使用的。 不同於 kubectl, hugo 這類的專案,自己寫的 cli 應用程式,常常會混著主要的應...

17 September 2023 · 2 min · nyo

如何寫 Go 的效能測試(Benchmark)

go 的測試工具 go test 有 benchmark 工具可以使用。 不用自己寫工具就可以很輕鬆的測試程式碼效能。 開始寫 benchmark 測試 建立 _test.go 結尾的檔案 function 要以 Benchmark 開頭 使用 b *testing.B 參數 將要測試的...

15 July 2023 · 2 min · nyo

如何在編譯 Go 時加入程式版本資訊

這裡有一段程式,執行時加上 -v 的參數就可以秀出程式的版號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package main import ( "flag" "fmt" ) const Version = "v0.1.0" func main() { var flagVersion bool flag.BoolVar(&flagVersion, "v", false, "version") flag.Parse()...

10 April 2023 · 2 min · nyo

開發 web service 的 main.go 需要寫什麼

想要用 go 開發一個 web service 很簡單,網路上有一大堆的範例, 但是通常你不太可能直接拿著範例就上戰場打仗。要應用在現實中的場景,通常還需要加一些程式。 這...

31 July 2022 · 3 min · nyo

升級 go.mod 裡的 go version

1.18 都 release 才想要看看怎麼把 go version 改到 1.17 修改 go.mod 使用 go mod edit 修改 go.mod 檔案的 go version 1 $ go mod edit -go=1.17 go 1.17 的 go mod tidy 增加了 -go 參數,可以直接修改 go.mod 檔案中的 go version 1 $ go mod tidy -go=1.17...

09 April 2022 · 1 min · nyo

玩看看 go 的泛型函數 (Generics Function)

在 2022-03-22 這天 Go 正式發佈 1.18 版了! 這個版本其中一大特色就是增加了社群討論許久的泛型(Generics) 今天來玩看看 go 的泛型函數(Generics Function) 沒...

29 March 2022 · 2 min · nyo

使用 brew 切換不同的 go 版本

使用 brew 安裝 go 可以很容易在不同的版本中切換。 Brew 目前我工作環境安裝的 brew 版本是 3.4.1,只要使用 link/unlink 指令就可以切換。 1 2 3 4 $ brew -v Homebrew 3.4.1-52-gf0f1eb6 Homebrew/homebrew-core (git revision 0192df1b390; last commit...

15 March 2022 · 1 min · nyo

優雅的關機 (Graceful Shutdown) Goroutine

Graceful shutdown 直接翻譯是 「優雅的關機」 這種做法是在收到程式終止的指令時,先處理好執行中的動作才結束程式。 使用這個機制可以正確的關閉連線,完成處理到一半...

06 July 2021 · 2 min · nyo

Interface in Go

Interface Go 的 interface (介面) 是一堆方法簽章集合而成的 type (型態), 只要一個 type 實作出 interface 定義的所有方法,就是實作 interface interface 是 Go 用來定義物件行為的方式,其概念是: 如果...

16 March 2021 · 2 min · nyo

試用 GORM

ORM (Object Relational Mapping) ORM 是一種把 資料庫 對應到 程式物件 的技術,可以讓開發者更快速的開發處理資料庫的程式 使用上常見優點: 快速開發 較高的安全性 也是有相對的缺點:...

05 August 2020 · 1 min · nyo

Go Modules With Private Git Repository

go 1.14 開始,go modules 可以在正式環境上使用了 你可能會建立自己私人的工具庫,這時要搭配 go modules 就需要做一些設定 基本的設定 假設現在要建立一個私有 module 倉庫,放...

11 July 2020 · 1 min · nyo

Functional Programming With Go

Functional Programming 中文:函數式程式設計,是程式設計方法 (programming paradigm) 的其中一種 所謂的 Functional Programming 是以數學函數的概念來設計程式,並避免有狀態 (state) 與避免可變資料 (mutable data) 以下是一些 Functional Programming...

26 June 2020 · 2 min · nyo

Log Rotate With Zap Logger

github.com/uber-go/zap, zap 是目前我比較常用的 logger package 在寫 log file 時,通常需要定期的封存檔案,避免單一檔案過大而導致之後難以整理 zap 本身沒有 rotation 功能,要自己寫,或是用 lumberjack 這個 package zap...

23 September 2019 · 1 min · nyo

Error Handling in Go

Go 原生的 Error Type 先認識 go 的 error interface 1 2 3 type error interface { Error() string } 只要 struct 實作 Error() 方法,就會是 error type,例如 os package 裡面的 PathError https://golang.org/pkg/os/#PathError 1 2 3 4 5 6 7 8 // PathError records an error and the operation and file path that...

26 July 2018 · 1 min · nyo

Try gRPC, grpc-gateway With Go

什麼是 gRPC Google 推出的 RPC framework 採用 Google 制定的 protocol buffers 當作資料傳輸格式 有 proto 工具可以把你寫好的 proto file 直接生成程式碼 比 RESTful API 更快、更有效率 更多請參考官網: grpc / grpc.io 安裝 開...

09 July 2018 · 3 min · nyo

Go Test All Testing in Project

想要跑當前專案下的所有 test 1 $ go test ./... Reference How to go test all testings in my project? - Stack Overflow

12 October 2017 · 1 min · nyo

用 Hugo 發佈部落格

Hugo 是用 Go 開發的靜態網站產生器 我為了把 blog 文章改放到 Github Page 上,一開始是想到 Jekyll 這個超熱門的工具 稍微研究一下後,發現是用 Ruby 寫的,讓我不太想用 最後是發現...

24 September 2017 · 1 min · nyo