2016-04-17 15 views
1

Ich brauche Hilfe, um zu verstehen, was mit meinem Dateilayout in einer einfachen Webanwendung nicht stimmt.Meine Datei main.go kann andere Dateien nicht sehen

$GOPATH/src/example.com/myweb 

Ich habe dann zwei Dateien:

$GOPATH/src/example.com/myweb/main.go 
$GOPATH/src/example.com/myweb/api.go 

Beide Dateien haben:

Paket Haupt sieht

Die api.go Datei wie:

package main 

import (
    "bytes" 
    "encoding/json" 
    "fmt" 
    "io" 
    "net/http" 
    "time" 
) 

type API struct { 
    URI string 
    Token string 
    Secret string 
    client *http.Client 
} 

... 

Meine Die Datei main.go sieht folgendermaßen aus:

package main 

import (
    "github.com/gorilla/mux" 
    "html/template" 
    "net/http" 
) 

var (
    templates = template.Must(template.ParseFiles("views/home.html", "views/history.html", "views/incident.html")) 
    api = API{ 
     URI: "http://localhost:3000", 
     Token: "abc", 
     Secret: "123", 
    } 
) 

func renderTemplate(w http.ResponseWriter, tmpl string, hp *HomePage) { 
.. 
.. 
} 

func WelcomeHandler(w http.ResponseWriter, r *http.Request) { 
.. 
.. 
} 

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/", WelcomeHandler) 
    r.PathPrefix("/assets/").Handler(
     http.StripPrefix("/assets/", http.FileServer(http.Dir("assets/")))) 

    http.ListenAndServe(":9000", r) 
} 

Im Code, den ich ausgeschlossen, ich structs im Grunde verwenden, die in meiner api.go-Datei definiert sind, und ich bekomme diese Fehlermeldung, wenn dabei:

go run main.go 
# command-line-arguments 
./main.go:16: undefined: API 
./main.go:23: undefined: User 

Was ich hier falsch genau mache?

Ich habe versucht, den Paketnamen in api.go zu myweb ändern, aber das hat nicht geholfen.

Soll ich den Paketnamen myweb verwenden? Ist nur 1 Datei Hauptsache?

+3

gehen laufen main.go api.go – Uvelichitel

+0

@Uvelichitel gibt es einen besseren Weg? Wenn ich weiterhin Dateien hinzufüge, wird es mir schwer fallen, alle Dateinamen so zu tippen. – Blankman

+1

Ja, Sie sollten "go install" oder "go build" verwenden – JimB

Antwort

1

Sie kompilieren nur die main.go-Datei. Sie sollten verwenden:

go run main.go api.go 

Oder:

go run *.go 

Wenn Sie eine komplexe Anwendung schreiben, können Sie alles, um Pakete in einem Unterverzeichnis hinzufügen und eine einzige main.go-Datei haben. Zum Beispiel hat etcd ein etcdmain Unterverzeichnis/Paket zusammen mit anderen Unterverzeichnissen/Paketen. Etwas wie:

/alarm  
/auth 
/cmd 
/etcdmain 
... 

Und die main.go-Datei ist einfach:

package main 

import "github.com/coreos/etcd/etcdmain" 

func main() { 
    etcdmain.Main() 
} 
-1

Sie sind golang Arbeitsplatz Projekt verwenden, die für die Struktur für Ihre Anwendung gut ist und es auch standardisieren.

Wenn wir den Golang-Arbeitsbereich verwenden, können Sie keine Single-Go-Datei ausführen. Sie müssen anrufen gehen Build/Go installieren.

Installieren

go install example.com/myweb 

Der obige Befehl Ihr Hauptpaket auf example.com/myweb kompilieren. Und die ausführbare Myweb-Binärdatei wird auf dem GOPATH/bin platziert. Und Sie können es manuell ausführen.

Bauen

go build example.com/myweb 

Der Befehl ist ähnlich zu gehen installieren, aber die ausführbare Binärdatei wird auf dem aktuellen Verzeichnis abgelegt werden, wenn Sie den Befehl aufrufen, anstatt auf GOPATH/bin (es sei denn, Ihr aktuelles Verzeichnis ist GOPATH/bin).

Für weitere Informationen überprüfen Sie bitte this link.

Verwandte Themen