Go 實用小技巧

本文持續產出、收錄一些筆者以爲好用的 Go 語法小技巧,還有一些初學 Go 遇到的「坑」,幫助節約平常開發時間,更多的時間能夠作本身喜歡作的事情。git

記錄函數耗時

因爲 Go 函數支持 defer 和閉包兩大強大的特性,因此咱們能夠使用一行語句便可實現統計函數耗時的功能github

// 函數主體
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併發

原文地址,建議收錄函數

相關文章
相關標籤/搜索