2016-07-21 18 views
1
package main 

import "fmt" 

const name = "Yosua" 
// or var name string = "James" 

func main() { 
    name := "Jobs" 
    fmt.Println(name) 
} 

Wie bezieht man sich auf die Konstante und nicht auf die Funktionspegelvariable?Siehe Konstanten- oder Package-Level-Variable anstelle der Funktionsebene Variable

+1

Dies wird nicht kompilieren. Ich muss fragen, warum willst du das machen? – squiguy

+0

Ah Entschuldigung, ich habe vergessen, die Package-Level-Variable zu löschen, damit sie nicht kompiliert werden kann. Ich möchte nur sicherstellen, dass Golang es schafft. –

Antwort

6

Sie können nicht. Während die lokale Variable name im Geltungsbereich ist, bezeichnet der Name name die lokale Variable. Und es gibt kein "Qualifikationsmerkmal", um auf Top-Level-Bezeichner zu verweisen.

Spec: Declarations and scope:

Eine Kennung in einem Block erklärt, kann in einem inneren Block neu deklariert werden. Während der Bezeichner der inneren Deklaration im Gültigkeitsbereich liegt, bezeichnet er die Entität, die von der inneren Deklaration deklariert wird.

Wenn Sie gleichzeitig auf die Konstanten/Variablen der obersten Ebene und die lokale Variable zugreifen müssen, verwenden Sie andere Namen.

Wenn aus irgendeinem Grund können Sie nicht oder wollen nicht, können Sie den Wert der obersten Ebene konstante oder variable erste speichern:

cname := name 
name := "Jobs" 
fmt.Println(name) 
fmt.Println(cname) 

Oder Sie können auch andere Mittel zur Verfügung stellen, um darauf zuzugreifen , z.B eine Funktion:

func getName() string { 
    return name 
} 

name := "Jobs" 
fmt.Println(name) 
fmt.Println(getName()) 

Ausgang in beiden Fällen (versuchen, sie auf den Go Playground):

Jobs 
Yosua