在Go 中,在for 迴圈中使用結構體表達式作為初始化器可能會在編譯過程中遇到語法錯誤。雖然指向結構的指標是可以接受的,但透過結構表達式宣告的局部變數可能會引發問題。
考慮以下程式碼片段:
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 } }()
此程式碼會觸發編譯時錯誤:「expected布林或範圍表達式,找到簡單的語句(複合文字周圍缺少括號?)」。之所以會產生歧義,是因為左大括號 { 可以解釋為複合文字的開頭,也可以解釋為 for 區塊的左大括號。
要解決此歧義,請將結構表達式括在括號中,明確表示:它是一個複合文字:
for r := (Request{}); r.err == nil; r.id++ { r.line, r.err = input.ReadSlice(0x0a) channel <- r }
透過此更改,程式碼將成功編譯並按預期執行,使用新的Request 結構初始化局部變數r並在每次迭代中遞增其id 值。
以上是為什麼使用結構表達式初始化器的 Go `for` 循環會失敗,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!