2014-02-09 2 views
12

В веб-сервере, например Go здесь: http://golang.org/doc/effective_go.html#web_serverвар против: = в Go

Следующая строка кода работает

var addr = flag.String("addr", ":1718", "http service address") 

но меняющегося его

addr := flag.String("addr", ":1718", "http service address") 

ошибка компиляции , Зачем? Имеет ли это какое-либо отношение к лицу, что возвращаемый тип функции равен *string вместо string? Какая разница?

ОБНОВЛЕНИЕ: Спасибо, что указали, что := не разрешен на верхнем уровне. Любая идея, почему эта несогласованность находится в спецификации? Я не вижу причин, чтобы поведение отличалось внутри блока.

ответ

8

Об обновленном вопросе: на самом деле существует разница между длинными и короткими объявлениями, находясь в той короткой форме, которая позволяет переопределять переменные.

От spec:

В отличие от обычных объявлений переменных, короткое объявление переменной может переопределить переменные при условии, что они первоначально были объявлены ранее в том же блоке, с тем же типом, и по крайней мере один из не-пустых переменных новый. Как следствие, переопределение может появляться только в короткой декларации с несколькими переменными. В Redeclaration не вводится новая переменная; он просто назначает новое значение оригиналу.

field1, offset := nextField(str, 0) 
field2, offset := nextField(str, offset) // redeclares offset 
a, a := 1, 2        // illegal: double declaration of a or no new variable if a was declared elsewhere 

Так что я бы сказал, что оператор := не чисто объявить, но больше как декларировать и назначить. Не допускается повторное выделение в верхнем слое, поэтому ни короткие объявления.

Другой причиной этого может быть простота синтаксиса. В Go все формы верхнего уровня начинаются с type, var или func. Короткие декларации разрушат всю миловидность.

+0

Это был просто синтаксический сахар для объявления + присвоения в предыдущих версиях. – thwd

9

В Go, присвоения переменных верхнего уровня должно быть с префиксом var. Опускание ключевого слова var разрешено только внутри блоков.

package main 

var toplevel = "Hello world"   // var keyword is required 

func F() { 
     withinBlock := "Hello world" // var keyword is not required 
} 
4

The Go Programming Language Specification

Short variable declarations

Короткое описание переменной используется синтаксис:

ShortVarDecl = IdentifierList ":=" ExpressionList . 

Короткие переменных могут появляться только внутри функции.

В вашем примере, изменение переменного оператора объявления вне тела функции

var addr = flag.String("addr", ":1718", "http service address") 

к короткой инструкции объявления переменной вне тела функции

addr := flag.String("addr", ":1718", "http service address") 

с ошибкой компилятора «не- заявление заявления вне тела функции. "

Смежные вопросы