Maison >développement back-end >Golang >Pourquoi une boucle Go `for` échoue-t-elle avec un initialiseur d'expression Struct et comment peut-elle être corrigée ?

Pourquoi une boucle Go `for` échoue-t-elle avec un initialiseur d'expression Struct et comment peut-elle être corrigée ?

DDD
DDDoriginal
2024-12-31 15:20:11389parcourir

Why Does a Go `for` Loop Fail with a Struct Expression Initializer, and How Can It Be Fixed?

Expression struct dans l'initialiseur de boucle For

Dans Go, l'utilisation d'une expression struct comme initialiseur dans une boucle for peut rencontrer des erreurs de syntaxe lors de la compilation. Bien que les pointeurs vers des structures soient acceptables, les variables locales déclarées via des expressions de structure peuvent soulever des problèmes.

Considérez l'extrait de code suivant :

type Request struct {
    id   int
    line []byte
    err  error
}

go func() {
    for r := Request{}; r.err == nil; r.id++ {
        r.line, r.err = input.ReadSlice(0x0a)
        channel <- r
    }
}()

Ce code déclenchera une erreur de compilation : "attendu expression booléenne ou de plage, instruction simple trouvée (parenthèses manquantes autour du littéral composite ?)". L'ambiguïté survient parce que l'accolade ouvrante { peut être interprétée soit comme le début d'un littéral composite, soit comme l'accolade ouvrante du bloc for.

Pour résoudre cette ambiguïté, placez l'expression struct entre parenthèses, en indiquant clairement que c'est un littéral composite :

for r := (Request{}); r.err == nil; r.id++ {
    r.line, r.err = input.ReadSlice(0x0a)
    channel <- r
}

Avec ce changement, le code sera compilé avec succès et exécuté comme prévu, initialisant la variable locale r avec une nouvelle structure Request et en incrémentant sa valeur d'identification à chaque itération.

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:
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