本文持續產出、收錄一些筆者以爲好用的 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")() // ... }
// 在 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") } }
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併發