Go 語言 goto 語句

Go 語言循環(huán)語句Go 語言循環(huán)語句

Go 語言的 goto 語句可以無條件地轉(zhuǎn)移到過程中指定的行。

goto語句通常與條件語句配合使用??捎脕韺崿F(xiàn)條件轉(zhuǎn)移, 構(gòu)成循環(huán),跳出循環(huán)體等功能。

但是,在結(jié)構(gòu)化程序設(shè)計中一般不主張使用goto語句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難。

語法

goto 語法格式如下:

goto label
..
.
label: statement

break 語句流程圖如下:

使用 goto 退出多層循環(huán)

下面這段代碼在滿足條件時,需要連續(xù)退出兩層循環(huán),使用傳統(tǒng)的編碼方式如下:

package main
import "fmt"
func main() {
    var breakAgain bool
    // 外循環(huán)
    for x := 0; x < 10; x++ {
        // 內(nèi)循環(huán)
        for y := 0; y < 10; y++ {
            // 滿足某個條件時, 退出循環(huán)
            if y == 2 {
                // 設(shè)置退出標(biāo)記
                breakAgain = true
                // 退出本次循環(huán)
                break
            }
        }
        // 根據(jù)標(biāo)記, 還需要退出一次循環(huán)
        if breakAgain {
                break
        }
    }
    fmt.Println("done")
}
將上面的代碼使用Go語言的 goto 語句進(jìn)行優(yōu)化:
package main
import "fmt"
func main() {
    for x := 0; x < 10; x++ {
        for y := 0; y < 10; y++ {
            if y == 2 {
                // 跳轉(zhuǎn)到標(biāo)簽
                goto breakHere
            }
        }
    }
    // 手動返回, 避免執(zhí)行進(jìn)入標(biāo)簽
    return
    // 標(biāo)簽
breakHere:
    fmt.Println("done")
}

使用 goto 集中處理錯誤

多處錯誤處理存在代碼重復(fù)時是非常棘手的,例如:

err := firstCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
err = secondCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
fmt.Println("done")

在上面代碼中,有一部分都是重復(fù)的錯誤處理代碼,如果后期在這些代碼中添加更多的判斷,就需要在這些雷同的代碼中依次修改,極易造成疏忽和錯誤。
使用 goto 語句來實現(xiàn)同樣的邏輯:

    err := firstCheckError()
    if err != nil {
        goto onExit
    }
    err = secondCheckError()
    if err != nil {
        goto onExit
    }
    fmt.Println("done")
    return
onExit:
    fmt.Println(err)
    exitProcess()

Go 語言循環(huán)語句Go 語言循環(huán)語句