2016-01-31 4 views
4

Любая идея, почему это структурное выражение для инициализатора цикла вызывает синтаксическую ошибку во время компиляции? Указатель на структуру отлично работает в этом случае, но in. Мне нужна локальная переменная, например, ниже. Спасибо за советы!Struct in for loop initializer

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

ответ

8

Упрощая вам код:

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

дает компиляции ошибки времени:

expected boolean or range expression, found simple statement (missing parentheses around composite literal?) (and 1 more errors)

Эта конструкция является неоднозначным для разбора. Открывающая скобка '{' не является очевидной, является ли она частью composite literal или открывающей скобкой самой for (forblock).

Вы можете сделать это очевидным, используя круглые скобки вокруг составного литерала (как говорит об ошибке):

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

Большое спасибо! Кажется, что у Gosublime есть другая ошибка. Без этих предложений .. – bigless