那些我的程式碼中從不用的 Golang 特性 – 馬特-萊亞

Airy發表於2019-02-16

– 我不使用的關鍵字

  • 我不用 goto

    goto 會讓程式碼執行邏輯難以閱讀和理解。

    另外還可以使用 label 標記來組織程式碼

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

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

  • 我不用 else

    大部分的 else 可以用反轉判斷來實現。例如:

    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

相關文章