本文持續產出、收錄一些筆者覺得好用的 Go 語法小技巧,還有一些初學 Go 遇到的“坑”,幫助節約日常開發時間,更多的時間可以做自己喜歡做的事情。
記錄函數耗時
由於 Go 函數支持 defer
和閉包兩大強大的特性,所以我們可以使用一行語句即可實現統計函數耗時的功能
// 函數主體
func TimeConsuming(tag string) func() {
now := time.Now().UnixNano() / 1000000
return func() {
after := time.Now().UnixNano() / 1000000
fmt.Printf("%q time cost %d ms\n", tag, after-now)
}
}
// 你需要統計耗時的函數
func main() {
// 函數首部調用即可,不影響函數整體美觀
defer TimeConsuming("main")()
// ...
}
Switch 的基本使用
// 在 Go 中輸出 one,如果是 Java 則輸出 one two three
// 在 Go 中匹配到匹配項後會自動跳出 switch,不需要在每一條 case 下寫 break
func main() {
i := 1
fmt.Println("Write ", i, " as ")
switch i {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
}
}
定義二維 Slice
twoD := make([][]int, 3)
for i := 0; i < 3; i++ {
innerLen := i + 1
twoD[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
獲取時間戳
now := time.Now()
// 時間戳:秒
secs := now.Unix()
// 時間戳:納秒
nanos := now.UnixNano()
// 時間戳:毫秒
millis := nanos / 1000000
控制併發數量(防止某些情況下宕機)
// 20 就是允許同時運行的最大 goroutine 數量
var sema = make(chan struct{}, 20)
func dirents(dir string) []os.FileInfo {
// 控制語句寫在函數的開頭位置即可
sema <- struct{}{}
defer func() { <-sema }()
entries, err := ioutil.ReadDir(dir)
if err != nil {
fmt.Fprintf(os.Stderr, "du1: %v\n", err)
return nil
}
return entries
}
定義包級別的枚舉字段
type Operation int
const (
Add Operation = iota + 1
Subtract
Multiply
)
大家平時有遇到什麼比較多的問題或者比較實用的技巧可以貼出來,本文持續解答和收錄。
QQ 學習交流羣:646026429