2014-02-09 3 views
12

Im Go Web-Server Beispiel hier: http://golang.org/doc/effective_go.html#web_servervar vs: = in Go

Die folgende Codezeile funktioniert

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

aber es

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

Wechsel ist ein Übersetzungsfehler . Warum? Hat es etwas damit zu tun, dass der Rückgabetyp der Funktion *string statt string ist? Welchen Unterschied macht das?

UPDATE: Vielen Dank für den Hinweis auf, dass := nicht auf der obersten Ebene erlaubt. Irgendeine Idee, warum diese Inkonsequenz in der Spezifikation ist? Ich sehe keinen Grund dafür, dass das Verhalten innerhalb eines Blocks anders ist.

Antwort

8

Auf der aktualisierten Frage: Es gibt tatsächlich einen Unterschied zwischen langen und kurzen Deklarationen, in dieser kurzen Form ermöglicht die Deklaration von Variablen.

Von spec:

Im Gegensatz zu normalen Variablendeklarationen, eine kurze Variablendeklaration können Variablen neu deklarieren, sofern sie wurden ursprünglich früher im selben Block mit dem gleichen Typ deklarieren, und zumindest einer der nicht leeren Variablen ist neu. Folglich kann eine Neudeklaration nur in einer Multivariablen-Short-Deklaration erscheinen. Redeklaration führt keine neue Variable ein; Es weist dem Original nur einen neuen Wert zu.

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 

Also würde ich sagen, dass die := Operator erklären nicht rein ist, sondern eher wie declare und zuweisen. Die Deklaration in Toplevel ist nicht erlaubt, also auch keine kurzen Deklarationen.

Ein anderer Grund dafür könnte Syntax Einfachheit sein. In Go beginnen alle Formulare auf höchster Ebene entweder mit type, var oder func. Kurze Erklärungen dort werden die ganze Niedlichkeit ruinieren.

+0

es war eigentlich nur syntaktischer Zucker für Deklaration + Zuweisung in früheren Versionen. – thwd

9

In Go, Top-Level-Variablenzuweisungen muss mit dem var Schlüsselwort vorangestellt werden. Das Auslassen des Schlüsselworts var ist nur innerhalb von Blöcken zulässig.

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

Eine kurze Variablendeklaration verwendet die Syntax:

ShortVarDecl = IdentifierList ":=" ExpressionList . 

Short Variablendeklarationen nur innerhalb von Funktionen erscheinen.

In Ihrem Beispiel die Variablendeklaration Anweisung außerhalb einer Funktion Körper ändert

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

auf eine kurze variable Deklarationsanweisung außerhalb einer Funktion Körper

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

schlägt mit Compiler-Fehler „nicht Deklarationsanweisung außerhalb des Funktionskörpers. "