首頁 後端開發 Golang go語言中goto怎麼用

go語言中goto怎麼用

Nov 23, 2022 pm 06:40 PM
go語言 goto

在go語言中,goto語句用於無條件跳轉,可以無條件地轉移到程式中指定的行;它透過標籤進行程式碼間的無條件跳轉。 goto後面接著一個標籤,這個標籤的意義是告訴Go程式下一步要執行哪行的程式碼,語法「goto 標籤;... ...標籤: 表達式;」。 goto打破原有程式碼執行順序,直接跳到指定行執行程式碼;goto語句通常與條件語句配合使用,可用來實現條件轉移、構成迴圈、跳出迴圈體等功能。

go語言中goto怎麼用

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

go語言中的goto語句

#goto 顧言思義,是跳躍的意思。

Go 語言的goto 語句可以無條件地轉移到程式中指定的行,透過標籤進行程式碼間的無條件跳轉,同時goto 語句在快速跳出迴圈、避免重複退出上也有一定的幫助,使用goto 語句能簡化一些程式碼的實作過程。

goto語句的語法

goto 後面接著一個標籤,這個標籤的意義是告訴 Go程式下一步要執行哪行的程式碼。

所以這個標籤如何放置,放置在哪裡,是 goto 裡最需要注意的。

goto 标签;
...
...
标签: 表达式;
登入後複製

goto 語句流程圖如下:

go語言中goto怎麼用

#goto語句的使用

  • goto 可以打破原有程式碼執行順序,直接跳到某一行執行程式碼。

import "fmt"

func main() {

    goto flag
    fmt.Println("B")
flag:
    fmt.Println("A")

}
登入後複製

執行結果,不會輸出 B ,只會輸出 A

A
登入後複製
  • goto 語句通常會與條件語句搭配使用。可用來實現條件轉移, 構成循環,跳出循環體等功能。

這邊舉個例子,用 goto 的方式實現一個印出 1到5 的循環。

import "fmt"

func main() {
    i := 1
flag:
    if i <= 5 {
        fmt.Println(i)
        i++
        goto flag
    }
}
登入後複製

輸出如下

go語言中goto怎麼用

再舉個例子,使用 goto 實作 類型 break 的效果。

import "fmt"

func main() {
    i := 1
    for {
        if i > 5 {
            goto flag
        }
        fmt.Println(i)
        i++
    }
flag:
}
登入後複製

輸出如下

go語言中goto怎麼用

最後再舉個例子,使用 goto 實作 型別 continue的效果,印出 1到10 的所有偶數。

import "fmt"

func main() {
    i := 1
flag:
    for i <= 10 {
        if i%2 == 1 {
            i++
            goto flag
        }
        fmt.Println(i)
        i++
    }
}
登入後複製

輸出如下

go語言中goto怎麼用

#使用goto 退出多層迴圈

下面這段程式碼在滿足條件時,需要連續退出兩層循環,使用傳統的編碼方式如下:

package main
import "fmt"
func main() {
    var breakAgain bool
    // 外循环
    for x := 0; x < 10; x++ {
        // 内循环
        for y := 0; y < 10; y++ {
            // 满足某个条件时, 退出循环
            if y == 2 {
                // 设置退出标记
                breakAgain = true
                // 退出本次循环
                break
            }
        }
        // 根据标记, 还需要退出一次循环
        if breakAgain {
                break
        }
    }
    fmt.Println("done")
}
登入後複製

程式碼說明如下:

  • 第10 行,建構外循環。

  • 第 13 行,建構內循環。

  • 第 16 行,當 y==2 時需要退出所有的 for 迴圈。

  • 第 19 行,預設循環只能一層一層退出,為此需要設定一個狀態變數 breakAgain,需要退出時,設定這個變數為 true。

  • 第 22 行,使用 break 退出目前循環,執行後,程式碼調轉到第 28 行。

  • 第 28 行,退出一層循環後,根據 breakAgain 變數判斷是否需要再次退出外層循環。

  • 第 34 行,退出所有循環後,列印 done。

將上面的程式碼使用Go語言的goto 語句進行最佳化:

package main
import "fmt"
func main() {
    for x := 0; x < 10; x++ {
        for y := 0; y < 10; y++ {
            if y == 2 {
                // 跳转到标签
                goto breakHere
            }
        }
    }
    // 手动返回, 避免执行进入标签
    return
    // 标签
breakHere:
    fmt.Println("done")
}
登入後複製

程式碼說明如下:

  • 第13行,使用goto 語句跳到所指明的標籤處,標籤在第23 行定義。

  • 第20 行,標籤只能被goto 使用,但不影響程式碼執行流程,此處如果不手動返回,在不滿足條件時,也會執行第24 行程式碼。

  • 第 23 行,定義 breakHere 標籤。

使用 goto 語句後,無須額外的變數就可以快速退出所有的迴圈。

使用goto 集中處理錯誤

多處錯誤處理存在程式碼重複時是非常棘手的,例如:

err := firstCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
err = secondCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
fmt.Println("done")
登入後複製

程式碼說明如下:

  • 第1 行,執行某邏輯,回傳錯誤。

  • 第 2~6 行,如果發生錯誤,列印錯誤退出進程。

  • 第 8 行,執行某邏輯,回傳錯誤。

  • 第 10~14 行,發生錯誤後退出流程。

  • 第 16 行,沒有任何錯誤,列印完成。

在上面程式碼中,有一部分都是重複的錯誤處理程式碼,如果後期在這些程式碼中加入更多的判斷,就需要在這些雷同的程式碼中依序修改,極易造成疏忽和錯誤。

使用 goto 语句来实现同样的逻辑:

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

代码说明如下:

  • 第 3 行和第 9 行,发生错误时,跳转错误标签 onExit。

  • 第 17 行和第 18 行,汇总所有流程进行错误打印并退出进程。

注意事项

goto语句与标签之间不能有变量声明,否则编译错误。

import "fmt"

func main() {
    fmt.Println("start")
    goto flag
    var say = "hello oldboy"
    fmt.Println(say)
flag:
    fmt.Println("end")
}
登入後複製

编译错误

.\main.go:7:7: goto flag jumps over declaration of say at .\main.go:8:6
登入後複製

【相关推荐:Go视频教程

以上是go語言中goto怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Apr 02, 2025 pm 12:57 PM

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

在Go編程中,如何正確管理Mysql和Redis的連接與釋放資源? 在Go編程中,如何正確管理Mysql和Redis的連接與釋放資源? Apr 02, 2025 pm 05:03 PM

Go編程中的資源管理:Mysql和Redis的連接與釋放在學習Go編程過程中,如何正確管理資源,特別是與數據庫和緩存�...

See all articles