In Go, using a struct expression as an initializer in a for loop can encounter syntax errors during compilation. While pointers to structs are acceptable, local variables declared through struct expressions may raise issues.
Consider the following code snippet:
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 } }()
This code will trigger a compile-time error: "expected boolean or range expression, found simple statement (missing parentheses around composite literal?)". The ambiguity arises because the opening brace { can be interpreted as either the beginning of a composite literal or the opening brace of the for block.
To resolve this ambiguity, enclose the struct expression in parentheses, making it clear that it is a composite literal:
for r := (Request{}); r.err == nil; r.id++ { r.line, r.err = input.ReadSlice(0x0a) channel <- r }
With this change, the code will compile successfully and execute as intended, initializing the local variable r with a new Request struct and incrementing its id value each iteration.
The above is the detailed content of Why Does a Go `for` Loop Fail with a Struct Expression Initializer, and How Can It Be Fixed?. For more information, please follow other related articles on the PHP Chinese website!