Maison développement back-end Golang Comment utiliser goto en langage go

Comment utiliser goto en langage go

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

Dans le langage go, l'instruction goto est utilisée pour les sauts inconditionnels, qui peuvent être transférés sans condition vers la ligne spécifiée dans le programme ; elle effectue des sauts inconditionnels entre les codes via des étiquettes. goto est suivi d'une étiquette. La signification de cette étiquette est d'indiquer au programme Go quelle ligne de code exécuter ensuite. La syntaxe est "goto label;... ...label: expression;". goto rompt l'ordre d'exécution du code d'origine et passe directement à la ligne spécifiée pour exécuter le code ; l'instruction goto est généralement utilisée conjointement avec des instructions conditionnelles et peut être utilisée pour implémenter des fonctions telles que le transfert conditionnel, la formation d'une boucle et le saut hors de le corps de la boucle.

Comment utiliser goto en langage go

L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.

L'instruction goto en langage go

goto Gu Yansi signifie sauter.

L'instruction goto du langage Go peut être transférée sans condition vers la ligne spécifiée dans le programme et sauter sans condition entre les codes via les étiquettes. En même temps, l'instruction goto est également utile pour sortir rapidement des boucles et éviter les sorties répétées. Les déclarations peuvent simplifier le processus de mise en œuvre de certains codes.

La syntaxe de l'instruction goto

goto est suivie d'une étiquette La signification de cette étiquette est d'indiquer au programme Go quelle ligne de code exécuter ensuite.

Alors, comment et où placer cette étiquette est la chose la plus importante à laquelle il faut prêter attention lors de goto. L'organigramme de l'instruction

goto 标签;
...
...
标签: 表达式;
Copier après la connexion

goto est le suivant :

Comment utiliser goto en langage go

Utilisation de l'instruction goto

  • goto peut rompre l'ordre d'exécution du code d'origine et passer directement à une certaine ligne d'exécution du code.

import "fmt"

func main() {

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

}
Copier après la connexion

Le résultat de l'exécution ne produira pas B, mais seules les instructions A

A
Copier après la connexion
  • goto sont généralement utilisées en conjonction avec des instructions conditionnelles. Il peut être utilisé pour implémenter un transfert conditionnel, former une boucle, sortir du corps de la boucle et d'autres fonctions.

Voici un exemple d'utilisation de goto pour implémenter une boucle qui imprime 1 à 5.

import "fmt"

func main() {
    i := 1
flag:
    if i <= 5 {
        fmt.Println(i)
        i++
        goto flag
    }
}
Copier après la connexion

Le résultat est le suivant

Comment utiliser goto en langage go

Un autre exemple, utilisez goto pour obtenir l'effet de type break.

import "fmt"

func main() {
    i := 1
    for {
        if i > 5 {
            goto flag
        }
        fmt.Println(i)
        i++
    }
flag:
}
Copier après la connexion

Le résultat est le suivant

Comment utiliser goto en langage go

Enfin, à titre d'exemple, utilisez goto pour obtenir l'effet de type continue, en imprimant tous les nombres pairs de 1 à 10.

import "fmt"

func main() {
    i := 1
flag:
    for i <= 10 {
        if i%2 == 1 {
            i++
            goto flag
        }
        fmt.Println(i)
        i++
    }
}
Copier après la connexion

Le résultat est le suivant

Comment utiliser goto en langage go

Utilisez goto pour quitter les boucles à plusieurs niveaux

Le code suivant doit quitter en permanence les boucles à deux niveaux lorsque les conditions sont remplies. La méthode de codage traditionnelle est la suivante. suit :

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")
}
Copier après la connexion

Description du code Comme suit :

  • Ligne 10, construisez la boucle extérieure.

  • Ligne 13, construisez la boucle intérieure.

  • Ligne 16, lorsque y==2, toutes les boucles for doivent être quittées.

  • Ligne 19. Par défaut, la boucle ne peut quitter que couche par couche. Pour ce faire, vous devez définir une variable d'état breakAgain. Lorsque vous devez quitter, définissez cette variable sur true.

  • À la ligne 22, utilisez break pour quitter la boucle en cours. Après exécution, le code est transféré à la ligne 28.

  • Ligne 28, après avoir quitté une couche de la boucle, utilisez la variable breakAgain pour déterminer s'il est nécessaire de quitter à nouveau la couche externe de la boucle.

  • Ligne 34, après avoir quitté toutes les boucles, impression terminée.

Optimisez le code ci-dessus à l'aide de l'instruction goto du langage Go :

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")
}
Copier après la connexion

La description du code est la suivante :

  • À la ligne 13, utilisez l'instruction goto pour accéder à l'étiquette spécifiée, qui est définie en ligne 23.

  • Ligne 20, le label ne peut être utilisé que par goto, mais cela n'affecte pas le processus d'exécution du code. Si vous ne revenez pas manuellement ici, la 24ème ligne de code sera également exécutée lorsque les conditions ne sont pas remplies.

  • Ligne 23, définissez la balise breakHere.

Après avoir utilisé l'instruction goto, toutes les boucles peuvent être rapidement quittées sans variables supplémentaires.

Utilisez goto pour gérer les erreurs de manière centralisée

C'est très délicat lorsqu'il y a des duplications de code dans plusieurs gestions d'erreurs, par exemple :

err := firstCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
err = secondCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
fmt.Println("done")
Copier après la connexion

La description du code est la suivante :

  • Ligne 1, exécutez un certaine logique et renvoie une erreur.

  • Ligne 2 ~ 6, si une erreur se produit, imprimez l'erreur et quittez le processus.

  • Ligne 8, exécute une certaine logique et renvoie une erreur.

  • Lignes 10 à 14, quittez le processus après qu'une erreur se produit.

  • Ligne 16, aucune erreur, impression terminée.

Dans le code ci-dessus, une partie est du code de gestion des erreurs répétées. Si d'autres jugements sont ajoutés ultérieurement à ces codes, ces codes similaires devront être modifiés dans l'ordre, ce qui peut facilement conduire à des oublis et des erreurs.

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

    err := firstCheckError()
    if err != nil {
        goto onExit
    }
    err = secondCheckError()
    if err != nil {
        goto onExit
    }
    fmt.Println("done")
    return
onExit:
    fmt.Println(err)
    exitProcess()
Copier après la connexion

代码说明如下:

  • 第 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")
}
Copier après la connexion

编译错误

.\main.go:7:7: goto flag jumps over declaration of say at .\main.go:8:6
Copier après la connexion

【相关推荐:Go视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Apr 02, 2025 pm 02:03 PM

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Apr 02, 2025 pm 12:57 PM

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Pourquoi est-il nécessaire de passer des pointeurs lors de l'utilisation de bibliothèques Go et Viper? Pourquoi est-il nécessaire de passer des pointeurs lors de l'utilisation de bibliothèques Go et Viper? Apr 02, 2025 pm 04:00 PM

GO POINTER SYNTAXE ET ATTENDRE DES PROBLÈMES DANS LA BIBLIOTHÈQUE VIPER Lors de la programmation en langage Go, il est crucial de comprendre la syntaxe et l'utilisation des pointeurs, en particulier dans ...

See all articles