Heim >Backend-Entwicklung >Golang >Warum schlägt eine Go-for-Schleife mit einem Strukturausdrucksinitialisierer fehl und wie kann das Problem behoben werden?

Warum schlägt eine Go-for-Schleife mit einem Strukturausdrucksinitialisierer fehl und wie kann das Problem behoben werden?

DDD
DDDOriginal
2024-12-31 15:20:11389Durchsuche

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

Strukturausdruck im For-Schleifen-Initialisierer

In Go kann die Verwendung eines Strukturausdrucks als Initialisierer in einer for-Schleife während der Kompilierung zu Syntaxfehlern führen. Während Zeiger auf Strukturen akzeptabel sind, können durch Strukturausdrücke deklarierte lokale Variablen Probleme verursachen.

Beachten Sie den folgenden Codeausschnitt:

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
    }
}()

Dieser Code löst einen Fehler bei der Kompilierung aus: „erwartet Boolescher Ausdruck oder Bereichsausdruck, einfache Anweisung gefunden (fehlende Klammern um zusammengesetztes Literal?)“. Die Mehrdeutigkeit entsteht, weil die öffnende geschweifte Klammer { entweder als Anfang eines zusammengesetzten Literals oder als öffnende geschweifte Klammer des for-Blocks interpretiert werden kann.

Um diese Mehrdeutigkeit aufzulösen, schließen Sie den Strukturausdruck in Klammern ein und machen Sie das deutlich Es handelt sich um ein zusammengesetztes Literal:

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

Mit dieser Änderung wird der Code erfolgreich kompiliert und wie vorgesehen ausgeführt, wobei die lokale Variable r mit a initialisiert wird Neue Anforderungsstruktur erstellen und ihren ID-Wert bei jeder Iteration erhöhen.

Das obige ist der detaillierte Inhalt vonWarum schlägt eine Go-for-Schleife mit einem Strukturausdrucksinitialisierer fehl und wie kann das Problem behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn