2017-04-20 6 views
0

ich eine kleine Go-Anwendung schreibe, dass einige globale consts in main.go wie unten definiert hat:Zugriff auf globale var von Kind Paket

main.go

package main 

import (
    "github.com/JackBracken/global/sub" 
) 

const AppName string = "global string" 

func main() { 
    sub.Run() 
} 

sub/sub.go

package sub 

import "fmt" 

func Run() { 
    fmt.Println(AppName) 
} 

Ich bin ziemlich neu zu gehen und würde erwarten, dass so etwas funktioniert, aber go build löst den Fehler sub/sub.go:6: undefined: AppName.

Ich weiß, dass ich so etwas wie die Schaffung ein globals Pakets tun kann, ist es in sub.go importieren und zu meinen globalen Variablen mit globals.AppName usw. beziehen, aber ich würde gerne wissen, ob es meine ursprüngliche Art und Weise möglich ist, oder bin ich nur ganz Missverständnis Scoping und Pakete?

+1

Sie können nicht importieren ein "Haupt" -Paket – JimB

+0

@ JimB Ich verstehe so viel, denke ich. Globale Variablen sind global nur innerhalb des Pakets, in dem sie definiert sind? Und um sie aus einem anderen Paket zu referenzieren, muss dieses Paket importiert werden? Ich nehme an, ich habe die Annahme gemacht, dass ein Unterpaket auf die globalen Variablen seiner Eltern zugreifen kann (aber je mehr ich es einlese, desto weniger scheint die Idee eines "Unterpakets" Sinn zu ergeben). –

+2

Sub-Pakete sind nicht einmal eine Sache in Go. Jedes Paket ist verschieden, sogar von Paketen in dem Verzeichnis, in dem sie ein Unterverzeichnis sind. Dort gibt es keinen impliziten Zugang. Wenn es in Ihrem Paket ist, können Sie es von Haus aus verwenden. Wenn es nicht in Ihrem Paket enthalten ist, müssen Sie es auch importieren, wenn es sich im übergeordneten Verzeichnis befindet. Und leider können Sie 'main' Pakete nicht importieren (außer in einer Testdatei), so dass alles in' package main' nur Zugriff auf dieses Paket hat, Punkt. – Kaedys

Antwort

4

Sie können nirgendwo sonst auf Symbole im "main" -Paket zugreifen, weil Go keine Importschleifen zulässt.

Wenn Sie auf eine Variable sowohl in 'main' als auch in einem anderen Paket zugreifen müssen, müssen Sie Ihre Variablen an einem anderen Ort in ein Paket verschieben, auf das beide zugreifen können. Also ist dein 'Globals' Paket die richtige Idee.

+0

Das macht für mich Sinn, Prost. –

Verwandte Themen