那些個人代碼中從不用的 Golang 特性 - 馬特-萊亞

- 我不使用的關鍵字golang

  • 我不用 goto編程

    goto 會讓代碼執行邏輯難以閱讀和理解。優化

    另外還可使用 label 標記來組織代碼code

    func main() {
    outer:
        for {
            log.Println("outer")
            for {
                log.Println("inner")
                break outer
            }
        }
    }
  • 我不用 fallthrough

    golang 的 switch 足夠好用,不須要用 fallthrough 退化到其餘語言的模式。ip

  • 我不用 elseit

    大部分的 else 能夠用反轉判斷來實現。例如:class

    if something.OK() {
        something.Lock()
        defer something.Unlock()
        err := something.Do()
        if err == nil {
                stop := StartTimer()
                defer stop()
                log.Println("working...")
                doWork(something)
                <-something.Done() // wait for it
                log.Println("finished")
                return nil
        } else {
                return err
        }
    } else {
        return errors.New("something not ok")
    }
    
    //
    // *守護式編程*
    // 上面的代碼能夠用反轉判斷來優化。
    if !something.OK() {  // flipped
        return errors.New("something not ok")
    }
    something.Lock()
    defer something.Unlock()
    err := something.Do()
    if err != nil {       // flipped
        return err
    }
    stop := StartTimer()
    defer stop()
    log.Println("working...")
    doWork(something)
    <-something.Done() // wait for it
    log.Println("finished")
    return nil
相關文章
相關標籤/搜索