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!